Merge commit '19031b24b523c872c1ac367821dc60c950a09755' as 'modules/libjuju'
authorAdam Israel <adam.israel@canonical.com>
Tue, 15 Aug 2017 19:26:43 +0000 (15:26 -0400)
committerAdam Israel <adam.israel@canonical.com>
Tue, 15 Aug 2017 19:26:43 +0000 (15:26 -0400)
130 files changed:
1  2 
modules/libjuju/.gitignore
modules/libjuju/.travis.yml
modules/libjuju/CONTRIBUTORS
modules/libjuju/LICENSE
modules/libjuju/MANIFEST.in
modules/libjuju/Makefile
modules/libjuju/README.rst
modules/libjuju/TODO
modules/libjuju/VERSION
modules/libjuju/docs/Makefile
modules/libjuju/docs/_extensions/automembersummary.py
modules/libjuju/docs/_static/custom.css
modules/libjuju/docs/api/juju.action.rst
modules/libjuju/docs/api/juju.annotation.rst
modules/libjuju/docs/api/juju.application.rst
modules/libjuju/docs/api/juju.client.rst
modules/libjuju/docs/api/juju.cloud.rst
modules/libjuju/docs/api/juju.constraints.rst
modules/libjuju/docs/api/juju.controller.rst
modules/libjuju/docs/api/juju.delta.rst
modules/libjuju/docs/api/juju.errors.rst
modules/libjuju/docs/api/juju.exceptions.rst
modules/libjuju/docs/api/juju.juju.rst
modules/libjuju/docs/api/juju.loop.rst
modules/libjuju/docs/api/juju.machine.rst
modules/libjuju/docs/api/juju.model.rst
modules/libjuju/docs/api/juju.placement.rst
modules/libjuju/docs/api/juju.relation.rst
modules/libjuju/docs/api/juju.tag.rst
modules/libjuju/docs/api/juju.unit.rst
modules/libjuju/docs/api/juju.utils.rst
modules/libjuju/docs/api/modules.rst
modules/libjuju/docs/changelog.rst
modules/libjuju/docs/conf.py
modules/libjuju/docs/index.rst
modules/libjuju/docs/narrative/application.rst
modules/libjuju/docs/narrative/controller.rst
modules/libjuju/docs/narrative/index.rst
modules/libjuju/docs/narrative/model.rst
modules/libjuju/docs/narrative/unit.rst
modules/libjuju/docs/readme.rst
modules/libjuju/docs/requirements.txt
modules/libjuju/docs/upstream-updates/index.rst
modules/libjuju/examples/action.py
modules/libjuju/examples/add_machine.py
modules/libjuju/examples/add_model.py
modules/libjuju/examples/allwatcher.py
modules/libjuju/examples/config.py
modules/libjuju/examples/controller.py
modules/libjuju/examples/deploy.py
modules/libjuju/examples/fullstatus.py
modules/libjuju/examples/future.py
modules/libjuju/examples/leadership.py
modules/libjuju/examples/livemodel.py
modules/libjuju/examples/localcharm.py
modules/libjuju/examples/relate.py
modules/libjuju/examples/unitrun.py
modules/libjuju/juju/__init__.py
modules/libjuju/juju/action.py
modules/libjuju/juju/annotation.py
modules/libjuju/juju/application.py
modules/libjuju/juju/client/__init__.py
modules/libjuju/juju/client/_client.py
modules/libjuju/juju/client/_client1.py
modules/libjuju/juju/client/_client2.py
modules/libjuju/juju/client/_client3.py
modules/libjuju/juju/client/_client4.py
modules/libjuju/juju/client/_client5.py
modules/libjuju/juju/client/_definitions.py
modules/libjuju/juju/client/client.py
modules/libjuju/juju/client/codegen.py
modules/libjuju/juju/client/connection.py
modules/libjuju/juju/client/facade.py
modules/libjuju/juju/client/overrides.py
modules/libjuju/juju/client/runner.py
modules/libjuju/juju/client/schemas-juju-2.0.0.json
modules/libjuju/juju/client/schemas-juju-2.0.1.json
modules/libjuju/juju/client/schemas-juju-2.0.2.json
modules/libjuju/juju/client/schemas-juju-2.0.3.json
modules/libjuju/juju/client/schemas-juju-2.1.0.json
modules/libjuju/juju/client/schemas-juju-2.1.1.json
modules/libjuju/juju/client/schemas-juju-2.1.2.json
modules/libjuju/juju/client/schemas-juju-2.2-alpha1.json
modules/libjuju/juju/client/schemas-juju-2.2-beta1.json
modules/libjuju/juju/client/schemas-juju-2.2-beta2.json
modules/libjuju/juju/client/schemas-juju-2.2-rc1.json
modules/libjuju/juju/client/schemas-juju-2.3-alpha1.json
modules/libjuju/juju/client/schemas-juju-latest.json
modules/libjuju/juju/cloud.py
modules/libjuju/juju/constraints.py
modules/libjuju/juju/controller.py
modules/libjuju/juju/credential.py
modules/libjuju/juju/delta.py
modules/libjuju/juju/errors.py
modules/libjuju/juju/exceptions.py
modules/libjuju/juju/juju.py
modules/libjuju/juju/loop.py
modules/libjuju/juju/machine.py
modules/libjuju/juju/model.py
modules/libjuju/juju/placement.py
modules/libjuju/juju/relation.py
modules/libjuju/juju/tag.py
modules/libjuju/juju/unit.py
modules/libjuju/juju/utils.py
modules/libjuju/scripts/gendoc
modules/libjuju/setup.py
modules/libjuju/tests/__init__.py
modules/libjuju/tests/base.py
modules/libjuju/tests/bundle/bundle.yaml
modules/libjuju/tests/charm/metadata.yaml
modules/libjuju/tests/integration/__init__.py
modules/libjuju/tests/integration/bundle/bundle.yaml
modules/libjuju/tests/integration/charm/metadata.yaml
modules/libjuju/tests/integration/test_application.py
modules/libjuju/tests/integration/test_client.py
modules/libjuju/tests/integration/test_connection.py
modules/libjuju/tests/integration/test_controller.py
modules/libjuju/tests/integration/test_errors.py
modules/libjuju/tests/integration/test_machine.py
modules/libjuju/tests/integration/test_model.py
modules/libjuju/tests/integration/test_unit.py
modules/libjuju/tests/unit/__init__.py
modules/libjuju/tests/unit/test_client.py
modules/libjuju/tests/unit/test_connection.py
modules/libjuju/tests/unit/test_constraints.py
modules/libjuju/tests/unit/test_loop.py
modules/libjuju/tests/unit/test_model.py
modules/libjuju/tests/unit/test_overrides.py
modules/libjuju/tests/unit/test_placement.py
modules/libjuju/tox.ini

index 0000000,0000000..866a785
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++*.sw[mnop]
++.venv/
++*.pyc
++*.py~
++docs/_build/
++__pycache__/
++.tox/
++*.egg-info/
++.cache/
++.\#*
++dist/
++dev/
index 0000000,0000000..0a57c38
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,23 @@@
++dist: trusty
++sudo: required
++language: python
++python:
++  - "3.5"
++before_install:
++  - sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable -y
++  - sudo apt-get update -q
++  - sudo apt-get install lxd snapd -y
++  - sudo usermod -a -G lxd $USER
++  - sudo service lxd start || true
++  - sudo lxd init --auto
++install: pip install tox-travis
++env:
++  - SNAP_CMD="sudo snap install juju --classic --stable"
++  - SNAP_CMD="sudo snap install juju --classic --edge"
++script:
++  - (eval "$SNAP_CMD")
++  - sudo ln -s /snap/bin/juju /usr/bin/juju || true
++  - sudo -E sudo -u $USER -E bash -c "/snap/bin/juju bootstrap localhost test"
++  - tox -e py35,integration
++  - sudo -E sudo -u $USER -E bash -c "/snap/bin/juju destroy-controller --destroy-all-models -y test"
++  - sudo snap remove juju
index 0000000,0000000..3895eaa
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++Benjamin Saller
++Tim Van Steenburgh
++Cory Johns
++Pete VanderGiessen
index 0000000,0000000..8dada3e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,201 @@@
++                                 Apache License
++                           Version 2.0, January 2004
++                        http://www.apache.org/licenses/
++
++   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++   1. Definitions.
++
++      "License" shall mean the terms and conditions for use, reproduction,
++      and distribution as defined by Sections 1 through 9 of this document.
++
++      "Licensor" shall mean the copyright owner or entity authorized by
++      the copyright owner that is granting the License.
++
++      "Legal Entity" shall mean the union of the acting entity and all
++      other entities that control, are controlled by, or are under common
++      control with that entity. For the purposes of this definition,
++      "control" means (i) the power, direct or indirect, to cause the
++      direction or management of such entity, whether by contract or
++      otherwise, or (ii) ownership of fifty percent (50%) or more of the
++      outstanding shares, or (iii) beneficial ownership of such entity.
++
++      "You" (or "Your") shall mean an individual or Legal Entity
++      exercising permissions granted by this License.
++
++      "Source" form shall mean the preferred form for making modifications,
++      including but not limited to software source code, documentation
++      source, and configuration files.
++
++      "Object" form shall mean any form resulting from mechanical
++      transformation or translation of a Source form, including but
++      not limited to compiled object code, generated documentation,
++      and conversions to other media types.
++
++      "Work" shall mean the work of authorship, whether in Source or
++      Object form, made available under the License, as indicated by a
++      copyright notice that is included in or attached to the work
++      (an example is provided in the Appendix below).
++
++      "Derivative Works" shall mean any work, whether in Source or Object
++      form, that is based on (or derived from) the Work and for which the
++      editorial revisions, annotations, elaborations, or other modifications
++      represent, as a whole, an original work of authorship. For the purposes
++      of this License, Derivative Works shall not include works that remain
++      separable from, or merely link (or bind by name) to the interfaces of,
++      the Work and Derivative Works thereof.
++
++      "Contribution" shall mean any work of authorship, including
++      the original version of the Work and any modifications or additions
++      to that Work or Derivative Works thereof, that is intentionally
++      submitted to Licensor for inclusion in the Work by the copyright owner
++      or by an individual or Legal Entity authorized to submit on behalf of
++      the copyright owner. For the purposes of this definition, "submitted"
++      means any form of electronic, verbal, or written communication sent
++      to the Licensor or its representatives, including but not limited to
++      communication on electronic mailing lists, source code control systems,
++      and issue tracking systems that are managed by, or on behalf of, the
++      Licensor for the purpose of discussing and improving the Work, but
++      excluding communication that is conspicuously marked or otherwise
++      designated in writing by the copyright owner as "Not a Contribution."
++
++      "Contributor" shall mean Licensor and any individual or Legal Entity
++      on behalf of whom a Contribution has been received by Licensor and
++      subsequently incorporated within the Work.
++
++   2. Grant of Copyright License. Subject to the terms and conditions of
++      this License, each Contributor hereby grants to You a perpetual,
++      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++      copyright license to reproduce, prepare Derivative Works of,
++      publicly display, publicly perform, sublicense, and distribute the
++      Work and such Derivative Works in Source or Object form.
++
++   3. Grant of Patent License. Subject to the terms and conditions of
++      this License, each Contributor hereby grants to You a perpetual,
++      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++      (except as stated in this section) patent license to make, have made,
++      use, offer to sell, sell, import, and otherwise transfer the Work,
++      where such license applies only to those patent claims licensable
++      by such Contributor that are necessarily infringed by their
++      Contribution(s) alone or by combination of their Contribution(s)
++      with the Work to which such Contribution(s) was submitted. If You
++      institute patent litigation against any entity (including a
++      cross-claim or counterclaim in a lawsuit) alleging that the Work
++      or a Contribution incorporated within the Work constitutes direct
++      or contributory patent infringement, then any patent licenses
++      granted to You under this License for that Work shall terminate
++      as of the date such litigation is filed.
++
++   4. Redistribution. You may reproduce and distribute copies of the
++      Work or Derivative Works thereof in any medium, with or without
++      modifications, and in Source or Object form, provided that You
++      meet the following conditions:
++
++      (a) You must give any other recipients of the Work or
++          Derivative Works a copy of this License; and
++
++      (b) You must cause any modified files to carry prominent notices
++          stating that You changed the files; and
++
++      (c) You must retain, in the Source form of any Derivative Works
++          that You distribute, all copyright, patent, trademark, and
++          attribution notices from the Source form of the Work,
++          excluding those notices that do not pertain to any part of
++          the Derivative Works; and
++
++      (d) If the Work includes a "NOTICE" text file as part of its
++          distribution, then any Derivative Works that You distribute must
++          include a readable copy of the attribution notices contained
++          within such NOTICE file, excluding those notices that do not
++          pertain to any part of the Derivative Works, in at least one
++          of the following places: within a NOTICE text file distributed
++          as part of the Derivative Works; within the Source form or
++          documentation, if provided along with the Derivative Works; or,
++          within a display generated by the Derivative Works, if and
++          wherever such third-party notices normally appear. The contents
++          of the NOTICE file are for informational purposes only and
++          do not modify the License. You may add Your own attribution
++          notices within Derivative Works that You distribute, alongside
++          or as an addendum to the NOTICE text from the Work, provided
++          that such additional attribution notices cannot be construed
++          as modifying the License.
++
++      You may add Your own copyright statement to Your modifications and
++      may provide additional or different license terms and conditions
++      for use, reproduction, or distribution of Your modifications, or
++      for any such Derivative Works as a whole, provided Your use,
++      reproduction, and distribution of the Work otherwise complies with
++      the conditions stated in this License.
++
++   5. Submission of Contributions. Unless You explicitly state otherwise,
++      any Contribution intentionally submitted for inclusion in the Work
++      by You to the Licensor shall be under the terms and conditions of
++      this License, without any additional terms or conditions.
++      Notwithstanding the above, nothing herein shall supersede or modify
++      the terms of any separate license agreement you may have executed
++      with Licensor regarding such Contributions.
++
++   6. Trademarks. This License does not grant permission to use the trade
++      names, trademarks, service marks, or product names of the Licensor,
++      except as required for reasonable and customary use in describing the
++      origin of the Work and reproducing the content of the NOTICE file.
++
++   7. Disclaimer of Warranty. Unless required by applicable law or
++      agreed to in writing, Licensor provides the Work (and each
++      Contributor provides its Contributions) on an "AS IS" BASIS,
++      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++      implied, including, without limitation, any warranties or conditions
++      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++      PARTICULAR PURPOSE. You are solely responsible for determining the
++      appropriateness of using or redistributing the Work and assume any
++      risks associated with Your exercise of permissions under this License.
++
++   8. Limitation of Liability. In no event and under no legal theory,
++      whether in tort (including negligence), contract, or otherwise,
++      unless required by applicable law (such as deliberate and grossly
++      negligent acts) or agreed to in writing, shall any Contributor be
++      liable to You for damages, including any direct, indirect, special,
++      incidental, or consequential damages of any character arising as a
++      result of this License or out of the use or inability to use the
++      Work (including but not limited to damages for loss of goodwill,
++      work stoppage, computer failure or malfunction, or any and all
++      other commercial damages or losses), even if such Contributor
++      has been advised of the possibility of such damages.
++
++   9. Accepting Warranty or Additional Liability. While redistributing
++      the Work or Derivative Works thereof, You may choose to offer,
++      and charge a fee for, acceptance of support, warranty, indemnity,
++      or other liability obligations and/or rights consistent with this
++      License. However, in accepting such obligations, You may act only
++      on Your own behalf and on Your sole responsibility, not on behalf
++      of any other Contributor, and only if You agree to indemnify,
++      defend, and hold each Contributor harmless for any liability
++      incurred by, or claims asserted against, such Contributor by reason
++      of your accepting any such warranty or additional liability.
++
++   END OF TERMS AND CONDITIONS
++
++   APPENDIX: How to apply the Apache License to your work.
++
++      To apply the Apache License to your work, attach the following
++      boilerplate notice, with the fields enclosed by brackets "{}"
++      replaced with your own identifying information. (Don't include
++      the brackets!)  The text should be enclosed in the appropriate
++      comment syntax for the file format. We also recommend that a
++      file or class name and description of purpose be included on the
++      same "printed page" as the copyright notice for easier
++      identification within third-party archives.
++
++   Copyright {yyyy} {name of copyright owner}
++
++   Licensed under the Apache License, Version 2.0 (the "License");
++   you may not use this file except in compliance with the License.
++   You may obtain a copy of the License at
++
++       http://www.apache.org/licenses/LICENSE-2.0
++
++   Unless required by applicable law or agreed to in writing, software
++   distributed under the License is distributed on an "AS IS" BASIS,
++   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++   See the License for the specific language governing permissions and
++   limitations under the License.
index 0000000,0000000..c14d3fc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++include *.py CONTRIBUTORS LICENSE README.rst VERSION
++recursive-include juju *.py
++recursive-include examples *.py
++recursive-include docs *.rst
++exclude Makefile
index 0000000,0000000..2e59306
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,40 @@@
++BIN := .tox/py35/bin
++PY := $(BIN)/python3.5
++PIP := $(BIN)/pip
++SCHEMAGEN := $(shell which schemagen)
++VERSION=$(shell cat VERSION)
++
++clean:
++      find . -name __pycache__ -type d -exec rm -r {} +
++      find . -name *.pyc -delete
++      rm -rf .tox
++      rm -rf docs/_build/
++
++.tox:
++      tox -r --notest
++
++client:
++ifndef SCHEMAGEN
++      $(error "schemagen is not available, please install from https://github.com/juju/schemagen")
++endif
++      $(PY) -m juju.client.facade -s "juju/client/schemas*" -o juju/client/
++
++test:
++      tox
++
++docs: .tox
++      $(PIP) install -r docs/requirements.txt
++      rm -rf docs/_build/
++      $(BIN)/sphinx-build -b html docs/  docs/_build/
++      cd docs/_build/ && zip -r docs.zip *
++
++release:
++      git remote | xargs -L1 git fetch --tags
++      $(PY) setup.py sdist upload
++      git tag ${VERSION}
++      git remote | xargs -L1 git push --tags
++
++upload: release
++
++
++.PHONY: clean client test docs upload release
index 0000000,0000000..c750ce5
new file mode 120000 (symlink)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++docs/readme.rst
index 0000000,0000000..94fc342
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++TODO
++====
++
++- Add a LogWatcher coroutine that yields from debug-log api
++- Add a way to exit the event loop when a Model matches a bundle yaml
index 0000000,0000000..a918a2a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++0.6.0
index 0000000,0000000..2869eb4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,230 @@@
++# Makefile for Sphinx documentation
++#
++
++# You can set these variables from the command line.
++SPHINXOPTS    =
++SPHINXBUILD   = sphinx-build
++PAPER         =
++BUILDDIR      = _build
++
++# User-friendly check for sphinx-build
++ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
++      $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\'t have Sphinx installed, grab it from http://sphinx-doc.org/)
++endif
++
++# Internal variables.
++PAPEROPT_a4     = -D latex_paper_size=a4
++PAPEROPT_letter = -D latex_paper_size=letter
++ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
++# the i18n builder cannot share the environment and doctrees with the others
++I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
++
++.PHONY: help
++help:
++      @echo "Please use \`make <target>' where <target> is one of"
++      @echo "  html       to make standalone HTML files"
++      @echo "  dirhtml    to make HTML files named index.html in directories"
++      @echo "  singlehtml to make a single large HTML file"
++      @echo "  pickle     to make pickle files"
++      @echo "  json       to make JSON files"
++      @echo "  htmlhelp   to make HTML files and a HTML help project"
++      @echo "  qthelp     to make HTML files and a qthelp project"
++      @echo "  applehelp  to make an Apple Help Book"
++      @echo "  devhelp    to make HTML files and a Devhelp project"
++      @echo "  epub       to make an epub"
++      @echo "  epub3      to make an epub3"
++      @echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
++      @echo "  latexpdf   to make LaTeX files and run them through pdflatex"
++      @echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
++      @echo "  text       to make text files"
++      @echo "  man        to make manual pages"
++      @echo "  texinfo    to make Texinfo files"
++      @echo "  info       to make Texinfo files and run them through makeinfo"
++      @echo "  gettext    to make PO message catalogs"
++      @echo "  changes    to make an overview of all changed/added/deprecated items"
++      @echo "  xml        to make Docutils-native XML files"
++      @echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
++      @echo "  linkcheck  to check all external links for integrity"
++      @echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
++      @echo "  coverage   to run coverage check of the documentation (if enabled)"
++      @echo "  dummy      to check syntax errors of document sources"
++
++.PHONY: clean
++clean:
++      rm -rf $(BUILDDIR)/*
++
++.PHONY: html
++html:
++      $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
++      @echo
++      @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
++
++.PHONY: dirhtml
++dirhtml:
++      $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
++      @echo
++      @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
++
++.PHONY: singlehtml
++singlehtml:
++      $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
++      @echo
++      @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
++
++.PHONY: pickle
++pickle:
++      $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
++      @echo
++      @echo "Build finished; now you can process the pickle files."
++
++.PHONY: json
++json:
++      $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
++      @echo
++      @echo "Build finished; now you can process the JSON files."
++
++.PHONY: htmlhelp
++htmlhelp:
++      $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
++      @echo
++      @echo "Build finished; now you can run HTML Help Workshop with the" \
++            ".hhp project file in $(BUILDDIR)/htmlhelp."
++
++.PHONY: qthelp
++qthelp:
++      $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
++      @echo
++      @echo "Build finished; now you can run "qcollectiongenerator" with the" \
++            ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
++      @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libjuju.qhcp"
++      @echo "To view the help file:"
++      @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libjuju.qhc"
++
++.PHONY: applehelp
++applehelp:
++      $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
++      @echo
++      @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
++      @echo "N.B. You won't be able to view it unless you put it in" \
++            "~/Library/Documentation/Help or install it in your application" \
++            "bundle."
++
++.PHONY: devhelp
++devhelp:
++      $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
++      @echo
++      @echo "Build finished."
++      @echo "To view the help file:"
++      @echo "# mkdir -p $$HOME/.local/share/devhelp/libjuju"
++      @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libjuju"
++      @echo "# devhelp"
++
++.PHONY: epub
++epub:
++      $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
++      @echo
++      @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
++
++.PHONY: epub3
++epub3:
++      $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
++      @echo
++      @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
++
++.PHONY: latex
++latex:
++      $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
++      @echo
++      @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
++      @echo "Run \`make' in that directory to run these through (pdf)latex" \
++            "(use \`make latexpdf' here to do that automatically)."
++
++.PHONY: latexpdf
++latexpdf:
++      $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
++      @echo "Running LaTeX files through pdflatex..."
++      $(MAKE) -C $(BUILDDIR)/latex all-pdf
++      @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
++
++.PHONY: latexpdfja
++latexpdfja:
++      $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
++      @echo "Running LaTeX files through platex and dvipdfmx..."
++      $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
++      @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
++
++.PHONY: text
++text:
++      $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
++      @echo
++      @echo "Build finished. The text files are in $(BUILDDIR)/text."
++
++.PHONY: man
++man:
++      $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
++      @echo
++      @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
++
++.PHONY: texinfo
++texinfo:
++      $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
++      @echo
++      @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
++      @echo "Run \`make' in that directory to run these through makeinfo" \
++            "(use \`make info' here to do that automatically)."
++
++.PHONY: info
++info:
++      $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
++      @echo "Running Texinfo files through makeinfo..."
++      make -C $(BUILDDIR)/texinfo info
++      @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
++
++.PHONY: gettext
++gettext:
++      $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
++      @echo
++      @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
++
++.PHONY: changes
++changes:
++      $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
++      @echo
++      @echo "The overview file is in $(BUILDDIR)/changes."
++
++.PHONY: linkcheck
++linkcheck:
++      $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
++      @echo
++      @echo "Link check complete; look for any errors in the above output " \
++            "or in $(BUILDDIR)/linkcheck/output.txt."
++
++.PHONY: doctest
++doctest:
++      $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
++      @echo "Testing of doctests in the sources finished, look at the " \
++            "results in $(BUILDDIR)/doctest/output.txt."
++
++.PHONY: coverage
++coverage:
++      $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
++      @echo "Testing of coverage in the sources finished, look at the " \
++            "results in $(BUILDDIR)/coverage/python.txt."
++
++.PHONY: xml
++xml:
++      $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
++      @echo
++      @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
++
++.PHONY: pseudoxml
++pseudoxml:
++      $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
++      @echo
++      @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
++
++.PHONY: dummy
++dummy:
++      $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
++      @echo
++      @echo "Build finished. Dummy builder generates no files."
index 0000000,0000000..898da62
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,114 @@@
++# Copyright 2014-2015 Canonical Limited.
++#
++# This file is part of charm-helpers.
++#
++# charm-helpers is free software: you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License version 3 as
++# published by the Free Software Foundation.
++#
++# charm-helpers is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU Lesser General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with charm-helpers.  If not, see <http://www.gnu.org/licenses/>.
++
++
++import importlib
++import inspect
++import textwrap
++
++from docutils import nodes
++from docutils.statemachine import ViewList
++from sphinx.errors import SphinxError
++from sphinx.util.compat import Directive
++from sphinx.util.nodes import nested_parse_with_titles
++
++
++class AutoMemberSummary(Directive):
++    required_arguments = 1
++
++    def run(self):
++        module_name = self.arguments[0]
++
++        try:
++            module = importlib.import_module(module_name)
++        except ImportError:
++            raise SphinxError("Unable to generate reference docs for %s, "
++                              "could not import" % (module_name))
++
++        divider = '+{:-<80}+'.format('')
++        row = '| {:<78} |'.format
++        lines = []
++        for member_name, member in inspect.getmembers(module):
++            if not self._filter(module_name, member_name, member):
++                continue
++            summary = textwrap.wrap(self._get_summary(member), 78) or ['']
++            link = '`{} <#{}>`_'.format(member_name,
++                                        '.'.join([module_name,
++                                                  member_name]))
++            methods = ['* `{} <#{}>`_'.format(n,
++                                              '.'.join([module_name,
++                                                        member_name,
++                                                        n]))
++                       for n, m in inspect.getmembers(member)
++                       if not n.startswith('_') and inspect.isfunction(m)]
++
++            lines.append(divider)
++            lines.append(row(link))
++            lines.append(divider)
++            for line in summary:
++                lines.append(row(line))
++            if methods:
++                lines.append(row(''))
++                lines.append(row('Methods:'))
++                lines.append(row(''))
++                for i, method in enumerate(methods):
++                    lines.append(row(method))
++        lines.append(divider)
++        content = '\n'.join(lines)
++
++        result = self._parse(content, '<automembersummary>')
++        return result
++
++    def _get_summary(self, member):
++        doc = (member.__doc__ or '').splitlines()
++
++        # strip any leading blank lines
++        while doc and not doc[0].strip():
++            doc.pop(0)
++
++        # strip anything after the first blank line
++        for i, piece in enumerate(doc):
++            if not piece.strip():
++                doc = doc[:i]
++                break
++
++        return " ".join(doc).strip()
++
++    def _filter(self, module_name, member_name, member):
++        if member_name.startswith('_'):
++            return False
++        if hasattr(member, '__module__'):
++            # skip imported classes & functions
++            return member.__module__.startswith(module_name)
++        elif hasattr(member, '__name__'):
++            # skip imported modules
++            return member.__name__.startswith(module_name)
++        else:
++            return False  # skip instances
++        return True
++
++    def _parse(self, rst_text, annotation):
++        result = ViewList()
++        for line in rst_text.split("\n"):
++            result.append(line, annotation)
++        node = nodes.paragraph()
++        node.document = self.state.document
++        nested_parse_with_titles(self.state, result, node)
++        return node.children
++
++
++def setup(app):
++    app.add_directive('automembersummary', AutoMemberSummary)
index 0000000,0000000..333cd74
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++.wy-table-responsive table td,
++.wy-table-responsive table th
++{
++    white-space: normal !important;
++}
index 0000000,0000000..cc86af2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.action
++===========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.action
++
++.. rubric:: Reference
++
++.. automodule:: juju.action
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..ec31344
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.annotation
++===============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.annotation
++
++.. rubric:: Reference
++
++.. automodule:: juju.annotation
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..dba9177
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.application
++================
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.application
++
++.. rubric:: Reference
++
++.. automodule:: juju.application
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..6a699c0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,120 @@@
++juju\.client package
++====================
++
++These packages are for internal use in communicating with the low-level
++API.  You should use the object oriented API instead.  They are documented
++here for developer reference.
++
++
++juju\.client\.client module
++---------------------------
++
++.. automodule:: juju.client.client
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._definitions module
++---------------------------------
++
++.. automodule:: juju.client._definitions
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client module
++----------------------------
++
++.. automodule:: juju.client._client
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client1 module
++-----------------------------
++
++.. automodule:: juju.client._client1
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client2 module
++-----------------------------
++
++.. automodule:: juju.client._client2
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client3 module
++-----------------------------
++
++.. automodule:: juju.client._client3
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client4 module
++-----------------------------
++
++.. automodule:: juju.client._client4
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\._client5 module
++-----------------------------
++
++.. automodule:: juju.client._client5
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\.codegen module
++----------------------------
++
++.. automodule:: juju.client.codegen
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\.connection module
++-------------------------------
++
++.. automodule:: juju.client.connection
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\.facade module
++---------------------------
++
++.. automodule:: juju.client.facade
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\.overrides module
++------------------------------
++
++.. automodule:: juju.client.overrides
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++juju\.client\.runner module
++---------------------------
++
++.. automodule:: juju.client.runner
++    :members:
++    :undoc-members:
++    :show-inheritance:
++
++
++Module contents
++---------------
++
++.. automodule:: juju.client
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..39021e0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.cloud
++==========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.cloud
++
++.. rubric:: Reference
++
++.. automodule:: juju.cloud
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..5fcbd31
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.constraints
++================
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.constraints
++
++.. rubric:: Reference
++
++.. automodule:: juju.constraints
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..4484fd5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.controller
++===============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.controller
++
++.. rubric:: Reference
++
++.. automodule:: juju.controller
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..9924f8c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.delta
++==========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.delta
++
++.. rubric:: Reference
++
++.. automodule:: juju.delta
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..7c77574
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.errors
++===========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.errors
++
++.. rubric:: Reference
++
++.. automodule:: juju.errors
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..85be2fb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.exceptions
++===============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.exceptions
++
++.. rubric:: Reference
++
++.. automodule:: juju.exceptions
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..68698c3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.juju
++=========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.juju
++
++.. rubric:: Reference
++
++.. automodule:: juju.juju
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..4f175e9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.loop
++=========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.loop
++
++.. rubric:: Reference
++
++.. automodule:: juju.loop
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..edb5b6c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.machine
++============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.machine
++
++.. rubric:: Reference
++
++.. automodule:: juju.machine
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..dfb735d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.model
++==========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.model
++
++.. rubric:: Reference
++
++.. automodule:: juju.model
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..67cde0c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.placement
++==============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.placement
++
++.. rubric:: Reference
++
++.. automodule:: juju.placement
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..90e3130
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.relation
++=============
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.relation
++
++.. rubric:: Reference
++
++.. automodule:: juju.relation
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..9b3a29f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.tag
++========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.tag
++
++.. rubric:: Reference
++
++.. automodule:: juju.tag
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..4a7d167
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.unit
++=========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.unit
++
++.. rubric:: Reference
++
++.. automodule:: juju.unit
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..9220a1b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++juju.utils
++==========
++
++.. rubric:: Summary
++
++.. automembersummary:: juju.utils
++
++.. rubric:: Reference
++
++.. automodule:: juju.utils
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..bf06f26
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++juju
++====
++
++It is recommended that you start with :doc:`juju.model` or :doc:`juju.controller`.
++If you need helpers to manage the asyncio loop, try :doc:`juju.loop`.
++
++.. toctree::
++
++    juju.action
++    juju.annotation
++    juju.application
++    juju.cloud
++    juju.constraints
++    juju.controller
++    juju.delta
++    juju.errors
++    juju.exceptions
++    juju.juju
++    juju.loop
++    juju.machine
++    juju.model
++    juju.placement
++    juju.relation
++    juju.tag
++    juju.unit
++    juju.utils
++
++.. automodule:: juju
++    :members:
++    :undoc-members:
++    :show-inheritance:
index 0000000,0000000..9da0cdc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,130 @@@
++Change Log
++----------
++
++0.6.0
++^^^^^
++Thu June 29 2017
++
++* Implement scp functionality (#149)
++* Add Unit.public_address property (#153)
++* Adds support for getting/setting config on a model (#152)
++
++0.5.3
++^^^^^
++Thu June 22 2017
++
++* Improve handling of closed connections (#148)
++* Configurable and larger max message size (#146)
++
++0.5.2
++^^^^^
++Wed June 14 2017
++
++* Fix deploying non-stable channels and explicit revs (#144)
++
++0.5.1
++^^^^^
++Tue June 13 2017
++
++* Update schema for Juju 2.3 alpha1 (#142)
++* Improve API doc navigation and coverage (#141)
++* Add type info to Model.add_machine docs (#138)
++
++0.5.0
++^^^^^
++Thu June 8 2017
++
++* Add machine status properties (#133)
++* Add model context manager (#128)
++* Implement Application.upgrade_charm method (#132)
++
++0.4.3
++^^^^^
++Thu June 1 2017
++
++* Accept new / unknown API fields gracefully (#131)
++* Add support for new agent-version field in ModelInfo (#131)
++* Replace pip with pip3 in install instructions (#129)
++* Strip local:-prefix from local charm urls (#121)
++
++0.4.2
++^^^^^
++Wed May 10 2017
++
++* Support (and prefer) per-controller macaroon files (#125)
++
++0.4.1
++^^^^^
++Wed Apr 27 2017
++
++* Remove VERSION_MAP and rely on facade list from controller (#118)
++* Refactor connection task management to avoid cancels (#117)
++* Refactored login code to better handle redirects (#116)
++
++0.4.0
++^^^^^
++Wed Apr 19 2017
++
++* Feature/api version support (#109)
++* Expanding controller.py with basic user functions, get_models and
++  destroy (#89)
++* Added Monitor class to Connection. (#105)
++* Support placement lists (#103)
++* Include resources from store when deploying (#102)
++* Allow underscore to dash translation when accessing model
++  attributes (#101)
++* Added controller to ssh fix. (#100)
++* Regen schema to pick up missing APIs
++* Improve error handling
++* Fix issue where we do not check to make sure that we are receiving the
++  correct response.
++* Retry calls to charmstore and increase timeout to 5s
++* Make connect_model and deploy a bit more friendly
++* Fix model name not including user
++* Implement Model.get_status
++* Add integration tests.
++
++0.3.0
++^^^^^
++Mon Feb 27 2017
++
++* Fix docstrings for placement directives.
++* Implement Model.add_machine()
++* Bug fix - "to" parameter to Model.deploy() was broken
++* Add docs and examples for adding machines and containers and deploying
++  charms to them.
++* Make Machine.destroy() block the current coroutine, returning only after
++  the machine is actually removed from the remote model. This is more
++  consistent with the way the other apis work (e.g. Model.deploy(),
++  Application.add_unit(), etc).
++* Raise NotImplementedError in all unimplemented method stubs instead of
++  silently passing.
++
++0.2.0
++^^^^^
++Thu Feb 16 2017
++
++* Add default ssh key to newly created model.
++* Add loop helpers and simplify examples/deploy.py
++* Add support for deploying local charms, and bundles containing local charm paths.
++* Add ability to get cloud name for controller.
++* Bug fix - fix wrong api used in Model.destroy_unit()
++* Add error detection in bundle deploy.
++
++0.1.2
++^^^^^
++Thu Dec 22 2016
++
++* Bug fix - Include docs in package
++
++0.1.1
++^^^^^
++Thu Dec 22 2016
++
++* Bug fix - Include VERSION file in package
++
++0.1.0
++^^^^^
++Wed Dec 21 2016
++
++* Initial Release
index 0000000,0000000..a95ec04
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,303 @@@
++# -*- coding: utf-8 -*-
++#
++# libjuju documentation build configuration file, created by
++# sphinx-quickstart on Thu May 19 11:21:38 2016.
++#
++# This file is execfile()d with the current directory set to its
++# containing dir.
++#
++# Note that not all possible configuration values are present in this
++# autogenerated file.
++#
++# All configuration values have a default; values that are commented out
++# serve to show the default.
++
++import sys
++import os
++
++from pathlib import Path
++
++here = Path(__file__).absolute().parent
++version = (here.parent / 'VERSION').read_text().strip()
++
++# If extensions (or modules to document with autodoc) are in another directory,
++# add these directories to sys.path here. If the directory is relative to the
++# documentation root, use os.path.abspath to make it absolute, like shown here.
++sys.path.insert(0, os.path.abspath('..'))
++
++# -- General configuration ------------------------------------------------
++
++# If your documentation needs a minimal Sphinx version, state it here.
++#needs_sphinx = '1.0'
++
++# Add any Sphinx extension module names here, as strings. They can be
++# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
++# ones.
++sys.path.append(os.path.abspath('_extensions/'))
++extensions = [
++    'sphinx.ext.autodoc',
++    'sphinx.ext.autosummary',
++    'sphinx.ext.intersphinx',
++    'sphinx.ext.todo',
++    'sphinx.ext.viewcode',
++    'sphinxcontrib.asyncio',
++    'automembersummary',
++]
++
++# Add any paths that contain templates here, relative to this directory.
++templates_path = ['_templates']
++
++# The suffix(es) of source filenames.
++# You can specify multiple suffix as a list of string:
++# source_suffix = ['.rst', '.md']
++source_suffix = '.rst'
++
++# The encoding of source files.
++#source_encoding = 'utf-8-sig'
++
++# The master toctree document.
++master_doc = 'index'
++
++# General information about the project.
++project = u'juju'
++copyright = u'2016, Canonical Ltd.'
++author = u'Canonical'
++
++# The version info for the project you're documenting, acts as replacement for
++# |version| and |release|, also used in various other places throughout the
++# built documents.
++#
++# The short X.Y version.
++version = version
++# The full version, including alpha/beta/rc tags.
++release = version
++
++# The language for content autogenerated by Sphinx. Refer to documentation
++# for a list of supported languages.
++#
++# This is also used if you do content translation via gettext catalogs.
++# Usually you set "language" from the command line for these cases.
++language = None
++
++# There are two options for replacing |today|: either, you set today to some
++# non-false value, then it is used:
++#today = ''
++# Else, today_fmt is used as the format for a strftime call.
++#today_fmt = '%B %d, %Y'
++
++# List of patterns, relative to source directory, that match files and
++# directories to ignore when looking for source files.
++# This patterns also effect to html_static_path and html_extra_path
++exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
++
++# The reST default role (used for this markup: `text`) to use for all
++# documents.
++#default_role = None
++
++# If true, '()' will be appended to :func: etc. cross-reference text.
++#add_function_parentheses = True
++
++# If true, the current module name will be prepended to all description
++# unit titles (such as .. function::).
++#add_module_names = True
++
++# If true, sectionauthor and moduleauthor directives will be shown in the
++# output. They are ignored by default.
++#show_authors = False
++
++# The name of the Pygments (syntax highlighting) style to use.
++pygments_style = 'sphinx'
++
++# A list of ignored prefixes for module index sorting.
++#modindex_common_prefix = []
++
++# If true, keep warnings as "system message" paragraphs in the built documents.
++#keep_warnings = False
++
++# If true, `todo` and `todoList` produce output, else they produce nothing.
++todo_include_todos = True
++
++
++# -- Options for HTML output ----------------------------------------------
++
++# The theme to use for HTML and HTML Help pages.  See the documentation for
++# a list of builtin themes.
++html_theme = 'sphinx_rtd_theme'
++
++# Theme options are theme-specific and customize the look and feel of a theme
++# further.  For a list of options available for each theme, see the
++# documentation.
++#html_theme_options = {}
++
++# Add any paths that contain custom themes here, relative to this directory.
++#html_theme_path = []
++
++# The name for this set of Sphinx documents.
++# "<project> v<release> documentation" by default.
++#html_title = u'libjuju v0.0.0'
++
++# A shorter title for the navigation bar.  Default is the same as html_title.
++#html_short_title = None
++
++# The name of an image file (relative to this directory) to place at the top
++# of the sidebar.
++#html_logo = None
++
++# The name of an image file (relative to this directory) to use as a favicon of
++# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
++# pixels large.
++#html_favicon = None
++
++# Add any paths that contain custom static files (such as style sheets) here,
++# relative to this directory. They are copied after the builtin static files,
++# so a file named "default.css" will overwrite the builtin "default.css".
++html_static_path = ['_static']
++
++# Add any extra paths that contain custom files (such as robots.txt or
++# .htaccess) here, relative to this directory. These files are copied
++# directly to the root of the documentation.
++#html_extra_path = []
++
++# If not None, a 'Last updated on:' timestamp is inserted at every page
++# bottom, using the given strftime format.
++# The empty string is equivalent to '%b %d, %Y'.
++#html_last_updated_fmt = None
++
++# If true, SmartyPants will be used to convert quotes and dashes to
++# typographically correct entities.
++#html_use_smartypants = True
++
++# Custom sidebar templates, maps document names to template names.
++#html_sidebars = {}
++
++# Additional templates that should be rendered to pages, maps page names to
++# template names.
++#html_additional_pages = {}
++
++# If false, no module index is generated.
++#html_domain_indices = True
++
++# If false, no index is generated.
++#html_use_index = True
++
++# If true, the index is split into individual pages for each letter.
++#html_split_index = False
++
++# If true, links to the reST sources are added to the pages.
++#html_show_sourcelink = True
++
++# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
++#html_show_sphinx = True
++
++# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
++#html_show_copyright = True
++
++# If true, an OpenSearch description file will be output, and all pages will
++# contain a <link> tag referring to it.  The value of this option must be the
++# base URL from which the finished HTML is served.
++#html_use_opensearch = ''
++
++# This is the file name suffix for HTML files (e.g. ".xhtml").
++#html_file_suffix = None
++
++# Language to be used for generating the HTML full-text search index.
++# Sphinx supports the following languages:
++#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
++#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
++#html_search_language = 'en'
++
++# A dictionary with options for the search language support, empty by default.
++# 'ja' uses this config value.
++# 'zh' user can custom change `jieba` dictionary path.
++#html_search_options = {'type': 'default'}
++
++# The name of a javascript file (relative to the configuration directory) that
++# implements a search results scorer. If empty, the default will be used.
++#html_search_scorer = 'scorer.js'
++
++# Output file base name for HTML help builder.
++htmlhelp_basename = 'libjujudoc'
++
++# -- Options for LaTeX output ---------------------------------------------
++
++latex_elements = {
++# The paper size ('letterpaper' or 'a4paper').
++#'papersize': 'letterpaper',
++
++# The font size ('10pt', '11pt' or '12pt').
++#'pointsize': '10pt',
++
++# Additional stuff for the LaTeX preamble.
++#'preamble': '',
++
++# Latex figure (float) alignment
++#'figure_align': 'htbp',
++}
++
++# Grouping the document tree into LaTeX files. List of tuples
++# (source start file, target name, title,
++#  author, documentclass [howto, manual, or own class]).
++latex_documents = [
++    (master_doc, 'libjuju.tex', u'libjuju Documentation',
++     u'Canonical', 'manual'),
++]
++
++# The name of an image file (relative to this directory) to place at the top of
++# the title page.
++#latex_logo = None
++
++# For "manual" documents, if this is true, then toplevel headings are parts,
++# not chapters.
++#latex_use_parts = False
++
++# If true, show page references after internal links.
++#latex_show_pagerefs = False
++
++# If true, show URL addresses after external links.
++#latex_show_urls = False
++
++# Documents to append as an appendix to all manuals.
++#latex_appendices = []
++
++# If false, no module index is generated.
++#latex_domain_indices = True
++
++
++# -- Options for manual page output ---------------------------------------
++
++# One entry per manual page. List of tuples
++# (source start file, name, description, authors, manual section).
++man_pages = [
++    (master_doc, 'libjuju', u'libjuju Documentation',
++     [author], 1)
++]
++
++# If true, show URL addresses after external links.
++#man_show_urls = False
++
++
++# -- Options for Texinfo output -------------------------------------------
++
++# Grouping the document tree into Texinfo files. List of tuples
++# (source start file, target name, title, author,
++#  dir menu entry, description, category)
++texinfo_documents = [
++    (master_doc, 'libjuju', u'libjuju Documentation',
++     author, 'libjuju', 'One line description of project.',
++     'Miscellaneous'),
++]
++
++# Documents to append as an appendix to all manuals.
++#texinfo_appendices = []
++
++# If false, no module index is generated.
++#texinfo_domain_indices = True
++
++# How to display URL addresses: 'footnote', 'no', or 'inline'.
++#texinfo_show_urls = 'footnote'
++
++# If true, do not generate a @detailmenu in the "Top" node's menu.
++#texinfo_no_detailmenu = False
++
++def setup(app):
++    app.add_stylesheet('custom.css')
index 0000000,0000000..b4b075f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,32 @@@
++.. libjuju documentation master file, created by
++   sphinx-quickstart on Thu May 19 11:21:38 2016.
++   You can adapt this file completely to your liking, but it should at least
++   contain the root `toctree` directive.
++
++
++.. include:: readme.rst
++
++
++Table of Contents
++-----------------
++
++.. toctree::
++   :glob:
++   :maxdepth: 3
++
++   narrative/index
++   API Docs <api/modules>
++   Internal API Docs <api/juju.client>
++   upstream-updates/index
++
++
++.. include:: changelog.rst
++
++
++Indices and tables
++==================
++
++* :ref:`genindex`
++* :ref:`modindex`
++* :ref:`search`
++
index 0000000,0000000..1565e5f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,136 @@@
++Applications
++============
++For api docs, see :class:`juju.application.Application`.
++
++
++Deploying
++---------
++To deploy a new application, connect a model and then call its
++:meth:`~juju.model.Model.deploy` method. An
++:class:`~juju.application.Application` instance is returned.
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++  mysql_app = await model.deploy(
++      # If a revision number is not included in the charm url,
++      # the latest revision from the Charm Store will be used.
++      'cs:mysql-55',
++      application_name='mysql',
++      series='trusty',
++      channel='stable',
++      config={
++          'tuning-level': 'safest',
++      },
++      constraints={
++          'mem': 256 * MB,
++      },
++  )
++
++
++Deploying a Local Charm
++-----------------------
++To deploy a local charm, pass the charm directory path to
++`Model.deploy()`.
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++  # Deploy a local charm using a path to the charm directory
++  await model.deploy(
++      '/home/tvansteenburgh/src/charms/ubuntu',
++      application_name='ubuntu',
++      series='trusty',
++  )
++
++
++Adding Units
++------------
++To add units to a deployed application, use the
++:meth:`juju.application.Application.add_units` method. A list of the newly
++added units (:class:`~juju.unit.Unit` objects) is returned.
++
++.. code:: python
++
++  ubuntu_app = await model.deploy(
++      'ubuntu',
++      application_name='ubuntu',
++      series='trusty',
++      channel='stable',
++  )
++
++  unit_a, unit_b = await ubuntu_app.add_units(count=2)
++
++
++Updating Config and Constraints
++-------------------------------
++Example showing how to update configuration and constraints on a deployed
++application. The `mysql_app` object is an instance of
++:class:`juju.application.Application`.
++
++.. code:: python
++
++  MB = 1024 * 1024
++
++  # Update and check app config
++  await mysql_app.set_config({'tuning-level': 'fast'})
++  config = await mysql_app.get_config()
++
++  assert(config['tuning-level']['value'] == 'fast')
++
++  # update and check app constraints
++  await mysql_app.set_constraints({'mem': 512 * MB})
++  constraints = await mysql_app.get_constraints()
++
++  assert(constraints['mem'] == 512 * MB)
++
++
++Adding and Removing Relations
++-----------------------------
++The :meth:`juju.application.Application.add_relation` method returns a
++:class:`juju.relation.Relation` instance.
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++  # Deploy mysql-master application
++  mysql_master = await model.deploy(
++      'cs:mysql-55',
++      application_name='mysql-master',
++      series='trusty',
++      channel='stable',
++  )
++
++  # Deploy mysql-slave application
++  mysql_slave = await model.deploy(
++      'cs:mysql-55',
++      application_name='mysql-slave',
++      series='trusty',
++      channel='stable',
++  )
++
++  # Add the master-slave relation
++  relation = await mysql_master.add_relation(
++      # Name of the relation on the local (mysql-master) side
++      'master',
++      # Name of the app:relation on the remote side
++      'mysql-slave:slave',
++  )
++
++  # Remove the relation
++  await mysql_master.remove_relation(
++      'master',
++      'mysql-slave:slave',
++  )
index 0000000,0000000..2da0e7b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,100 @@@
++Controllers
++===========
++A Juju controller provides websocket endpoints for itself and each of its
++models. In order to do anything useful, the juju lib must connect to one of
++these endpoints.
++
++Connecting to the controller endpoint is useful if you want to programmatically
++create a new model. If the model you want to use already exists, you can
++connect directly to it (see :doc:`model`).
++
++For api docs, see :class:`juju.controller.Controller`.
++
++
++Connecting to the Current Controller
++------------------------------------
++Connect to the currently active Juju controller (the one returned by
++`juju switch`). This only works if you have the Juju CLI client installed.
++
++.. code:: python
++
++  from juju.controller import Controller
++
++  controller = Controller()
++  await controller.connect_current()
++
++
++Connecting to a Named Controller
++--------------------------------
++Connect to a controller by name.
++
++.. code:: python
++
++  from juju.controller import Controller
++
++  controller = Controller()
++  await controller.connect_controller('mycontroller')
++
++
++Connecting with Username/Password Authentication
++------------------------------------------------
++The most flexible, but also most verbose, way to connect is using the API
++endpoint url and credentials directly. This method does NOT require the Juju
++CLI client to be installed.
++
++.. code:: python
++
++  from juju.controller import Controller
++
++  controller = Controller()
++
++  controller_endpoint = '10.0.4.171:17070'
++  username = 'admin'
++  password = 'f53f08cfc32a2e257fe5393271d89d62'
++
++  # Left out for brevity, but if you have a cert string you should pass it in.
++  # You can copy the cert from the output of The `juju show-controller`
++  # command.
++  cacert = None
++
++  await controller.connect(
++      controller_endpoint,
++      username,
++      password,
++      cacert,
++  )
++
++
++Connecting with Macaroon Authentication
++---------------------------------------
++To connect to a shared controller, you'll need
++to use macaroon authentication. The simplest example is shown below, and uses
++already-discharged macaroons from the local filesystem. This will work if you
++have the Juju CLI installed.
++
++.. note::
++
++  The library does not yet contain support for fetching and discharging
++  macaroons. Until it does, if you want to use macaroon auth, you'll need
++  to supply already-discharged macaroons yourself.
++
++.. code:: python
++
++  from juju.client.connection import get_macaroons()
++  from juju.controller import Controller
++
++  controller = Controller()
++
++  controller_endpoint = '10.0.4.171:17070'
++  username = None
++  password = None
++  cacert = None
++  macaroons = get_macaroons()
++
++  await controller.connect(
++      controller_endpoint,
++      username,
++      password,
++      cacert,
++      macaroons,
++  )
index 0000000,0000000..eb77e4c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,11 @@@
++Narrative Docs
++==============
++
++.. toctree::
++   :glob:
++   :maxdepth: 2
++
++   controller
++   model
++   application
++   unit
index 0000000,0000000..57dbc81
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,306 @@@
++Models
++======
++A Juju controller provides websocket endpoints for each of its
++models. In order to do anything useful with a model, the juju lib must
++connect to one of these endpoints. There are several ways to do this.
++
++For api docs, see :class:`juju.model.Model`.
++
++
++Connecting to the Current Model
++-------------------------------
++Connect to the currently active Juju model (the one returned by
++`juju switch`). This only works if you have the Juju CLI client installed.
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++
++Connecting to a Named Model
++---------------------------
++Connect to a model by name, using the same format as that returned from the
++`juju switch` command. The accepted format is '[controller:][user/]model'.
++This only works if you have the Juju CLI client installed.
++
++.. code:: python
++
++  # $ juju switch
++  # juju-2.0.1:admin/libjuju
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_model('juju-2.0.1:admin/libjuju')
++
++
++Connecting with Username/Password Authentication
++------------------------------------------------
++The most flexible, but also most verbose, way to connect is using the API
++endpoint url and credentials directly. This method does NOT require the Juju
++CLI client to be installed.
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++
++  controller_endpoint = '10.0.4.171:17070'
++  model_uuid = 'e8399ac7-078c-4817-8e5e-32316d55b083'
++  username = 'admin'
++  password = 'f53f08cfc32a2e257fe5393271d89d62'
++
++  # Left out for brevity, but if you have a cert string you should pass it in.
++  # You can copy the cert from the output of The `juju show-controller`
++  # command.
++  cacert = None
++
++  await model.connect(
++      controller_endpoint,
++      model_uuid,
++      username,
++      password,
++      cacert,
++  )
++
++
++Connecting with Macaroon Authentication
++---------------------------------------
++To connect to a shared model, or a model an a shared controller, you'll need
++to use macaroon authentication. The simplest example is shown below, and uses
++already-discharged macaroons from the local filesystem. This will work if you
++have the Juju CLI installed.
++
++.. note::
++
++  The library does not yet contain support for fetching and discharging
++  macaroons. Until it does, if you want to use macaroon auth, you'll need
++  to supply already-discharged macaroons yourself.
++
++.. code:: python
++
++  from juju.client.connection import get_macaroons()
++  from juju.model import Model
++
++  model = Model()
++
++  controller_endpoint = '10.0.4.171:17070'
++  model_uuid = 'e8399ac7-078c-4817-8e5e-32316d55b083'
++  username = None
++  password = None
++  cacert = None
++  macaroons = get_macaroons()
++
++  await model.connect(
++      controller_endpoint,
++      model_uuid,
++      username,
++      password,
++      cacert,
++      macaroons,
++  )
++
++
++Creating and Destroying a Model
++-------------------------------
++Example of creating a new model and then destroying it. See
++:meth:`juju.controller.Controller.add_model` and
++:meth:`juju.controller.Controller.destroy_model` for more info.
++
++.. code:: python
++
++  from juju.controller import Controller
++
++  controller = Controller()
++  await controller.connect_current()
++
++  # Create our new model
++  model = await controller.add_model(
++      'mymodel',  # name of your new model
++  )
++
++  # Do stuff with our model...
++
++  # Destroy the model
++  await model.disconnect()
++  await controller.destroy_model(model.info.uuid)
++  model = None
++
++
++Adding Machines and Containers
++------------------------------
++To add a machine or container, connect to a model and then call its
++:meth:`~juju.model.Model.add_machine` method. A
++:class:`~juju.machine.Machine` instance is returned. The machine id
++can be used to deploy a charm to a specific machine or container.
++
++.. code:: python
++
++  from juju.model import Model
++
++  MB = 1
++  GB = 1024
++
++
++  model = Model()
++  await model.connect_current()
++
++  # add a new default machine
++  machine1 = await model.add_machine()
++
++  # add a machine with constraints, disks, and series specified
++  machine2 = await model.add_machine(
++      constraints={
++          'mem': 256 * MB,
++      },
++      disks=[{
++          'pool': 'rootfs',
++          'size': 10 * GB,
++          'count': 1,
++      }],
++      series='xenial',
++  )
++
++  # add a lxd container to machine2
++  machine3 = await model.add_machine(
++      'lxd:{}'.format(machine2.id))
++
++  # deploy charm to the lxd container
++  application = await model.deploy(
++      'ubuntu-10',
++      application_name='ubuntu',
++      series='xenial',
++      channel='stable',
++      to=machine3.id
++  )
++
++  # remove application
++  await application.remove()
++
++  # destroy machines - note that machine3 must be destroyed before machine2
++  # since it's a container on machine2
++  await machine3.destroy(force=True)
++  await machine2.destroy(force=True)
++  await machine1.destroy(force=True)
++
++
++Reacting to Changes in a Model
++------------------------------
++To watch for and respond to changes in a model, register an observer with the
++model. The easiest way to do this is by creating a
++:class:`juju.model.ModelObserver` subclass.
++
++.. code:: python
++
++  from juju.model import Model, ModelObserver
++
++  class MyModelObserver(ModelObserver):
++      async def on_change(self, delta, old, new, model):
++          # The raw change data (dict) from the websocket.
++          print(delta.data)
++
++          # The entity type (str) affected by this change.
++          # One of ('action', 'application', 'annotation', 'machine',
++          # 'unit', 'relation')
++          print(delta.entity)
++
++          # The type (str) of change.
++          # One of ('add', 'change', 'remove')
++          print(delta.type)
++
++          # The 'old' and 'new' parameters are juju.model.ModelEntity
++          # instances which represent an entity in the model both before
++          # this change was applied (old) and after (new).
++
++          # If an entity is being added to the model, the 'old' param
++          # will be None.
++          if delta.type == 'add':
++              assert(old is None)
++
++          # If an entity is being removed from the model, the 'new' param
++          # will be None.
++          if delta.type == 'remove':
++              assert(new is None)
++
++          # The 'old' and 'new' parameters, when not None, will be instances
++          # of a juju.model.ModelEntity subclass. The type of the subclass
++          # depends on the value of 'delta.entity', for example:
++          #
++          # delta.entity     type
++          # ------------     ----
++          # 'action'      -> juju.action.Action
++          # 'application' -> juju.application.Application
++          # 'annotation'  -> juju.annotation.Annotation
++          # 'machine'     -> juju.machine.Machine
++          # 'unit'        -> juju.unit.Unit
++          # 'relation'    -> juju.relation.Relation
++
++          # Finally, the 'model' parameter is a reference to the
++          # juju.model.Model instance to which this observer is attached.
++          print(id(model))
++
++
++  model = Model()
++  await model.connect_current()
++
++  model.add_observer(MyModelObserver())
++
++
++Every change in the model will result in a call to the `on_change()`
++method of your observer(s).
++
++To target your code more precisely, define method names that correspond
++to the entity and type of change that you wish to handle.
++
++.. code:: python
++
++  from juju.model import Model, ModelObserver
++
++  class MyModelObserver(ModelObserver):
++      async def on_application_change(self, delta, old, new, model):
++          # Both 'old' and 'new' params will be instances of
++          # juju.application.Application
++          pass
++
++      async def on_unit_remove(self, delta, old, new, model):
++          # Since a unit is being removed, the 'new' param will always
++          # be None in this handler. The 'old' param will be an instance
++          # of juju.unit.Unit - the state of the unit before it was removed.
++          pass
++
++      async def on_machine_add(self, delta, old, new, model):
++          # Since a machine is being added, the 'old' param will always be
++          # None in this handler. The 'new' param will be an instance of
++          # juju.machine.Machine.
++          pass
++
++      async def on_change(self, delta, old, new, model):
++          # The catch-all handler - will be called whenever a more
++          # specific handler method is not defined.
++
++
++Any :class:`juju.model.ModelEntity` object can be observed directly by
++registering callbacks on the object itself.
++
++.. code:: python
++
++  import logging
++
++  async def on_app_change(delta, old, new, model):
++      logging.debug('App changed: %r', new)
++
++  async def on_app_remove(delta, old, new, model):
++      logging.debug('App removed: %r', old)
++
++  ubuntu_app = await model.deploy(
++      'ubuntu',
++      application_name='ubuntu',
++      series='trusty',
++      channel='stable',
++  )
++  ubuntu_app.on_change(on_app_change)
++  ubuntu_app.on_remove(on_app_remove)
index 0000000,0000000..5d6b48d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,65 @@@
++Units
++=====
++For api docs, see :class:`juju.unit.Unit`.
++
++
++Running Commands
++----------------
++Run arbitrary commands on a unit with the
++:meth:`juju.unit.Unit.run` method. This method blocks
++the current coroutine until a result is available, and
++returns a :class:`juju.action.Action` instance.
++
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++  app = await model.deploy(
++      'ubuntu',
++      application_name='ubuntu',
++      series='trusty',
++      channel='stable',
++  )
++
++  for unit in app.units:
++      action = await unit.run('unit-get public-address')
++      print(action.results)
++
++      action = await unit.run('uname -a')
++      print(action.results)
++
++
++Running Actions
++---------------
++Run actions on a unit with the
++:meth:`juju.unit.Unit.run_action` method. This method
++returns a :class:`juju.action.Action` instance immediately. To block until
++the action completes, use the :meth:`juju.action.Action.wait` method, as
++in the example below.
++
++
++.. code:: python
++
++  from juju.model import Model
++
++  model = Model()
++  await model.connect_current()
++
++  app = await model.deploy(
++      'git',
++      application_name='git',
++      series='trusty',
++      channel='stable',
++  )
++
++  for unit in app.units:
++      # run the 'add-repo' action, passing a 'repo' param
++      action = await unit.run_action('add-repo', repo='myrepo')
++      # wait for the action to complete
++      action = await action.wait()
++
++      print(action.results)
index 0000000,0000000..ecfbc5a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,95 @@@
++A Python library for Juju
++=========================
++
++Source code: https://github.com/juju/python-libjuju
++
++Bug reports: https://github.com/juju/python-libjuju/issues
++
++Documentation: https://pythonlibjuju.readthedocs.io/en/latest/
++
++
++Requirements
++------------
++
++* Python 3.5+
++* Juju 2.0+
++
++
++Design Notes
++------------
++
++* Asynchronous - uses asyncio and async/await features of python 3.5
++* Websocket-level bindings are programmatically generated (indirectly) from the
++  Juju golang code, ensuring full api coverage
++* Provides an OO layer which encapsulates much of the websocket api and
++  provides familiar nouns and verbs (e.g. Model.deploy(), Application.add_unit(),
++  etc.)
++
++
++Installation
++------------
++
++.. code:: bash
++
++  pip3 install juju
++
++
++Quickstart
++----------
++Here's a simple example that shows basic usage of the library. The example
++connects to the currently active Juju model, deploys a single unit of the
++ubuntu charm, then exits.
++
++More examples can be found in the `examples/` directory of the source tree,
++and in the documentation.
++
++
++.. code:: python
++
++  #!/usr/bin/python3.5
++
++  import asyncio
++  import logging
++
++  from juju import loop
++  from juju.model import Model
++
++
++  async def deploy():
++      # Create a Model instance. We need to connect our Model to a Juju api
++      # server before we can use it.
++      model = Model()
++
++      # Connect to the currently active Juju model
++      await model.connect_current()
++
++      # Deploy a single unit of the ubuntu charm, using revision 0 from the
++      # stable channel of the Charm Store.
++      ubuntu_app = await model.deploy(
++          'ubuntu-0',
++          application_name='ubuntu',
++          series='xenial',
++          channel='stable',
++      )
++
++      # Disconnect from the api server and cleanup.
++      model.disconnect()
++
++
++  def main():
++      # Set logging level to debug so we can see verbose output from the
++      # juju library.
++      logging.basicConfig(level=logging.DEBUG)
++
++      # Quiet logging from the websocket library. If you want to see
++      # everything sent over the wire, set this to DEBUG.
++      ws_logger = logging.getLogger('websockets.protocol')
++      ws_logger.setLevel(logging.INFO)
++
++      # Run the deploy coroutine in an asyncio event loop, using a helper
++      # that abstracts loop creation and teardown.
++      loop.run(deploy())
++
++
++  if __name__ == '__main__':
++      main()
index 0000000,0000000..06377bf
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++websockets
++pyyaml
++theblues
++python-dateutil
++sphinx
++sphinxcontrib-asyncio
++sphinx_rtd_theme
index 0000000,0000000..52099e6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,66 @@@
++Upstream Updates
++================
++
++Updating the facade and definitions code generated from the schema
++to reflect changes in upstream Juju consists of two steps:
++
++* Creating a new `schemas-juju-<version>.json` file from the Juju code-base
++* Generating the libjuju Python code from that schema
++
++Rarely, you may also have to add or update an override.
++
++
++Creating a Schema File
++----------------------
++
++First, you will need to fetch SchemaGen_ and a copy of the Juju source.
++Once your copy of the Juju source is at the version you want to update to
++(probably the `develop` branch, or a release tag) and you have updated
++and reinstalled SchemaGen to reflect those changes, you just need to send
++the output into a file in the libjuju repository:
++
++.. code:: bash
++
++  schemagen > juju/client/schemas-juju-2.2-rc1.json
++
++The version number you use in the filename should match the upstream
++version of Juju.  You should then also move the `latest` pointer to
++the new file:
++
++.. code:: bash
++
++  rm juju/client/schemas-juju-latest.json
++  ln -s schemas-juju-2.2-rc1.json juju/client/schemas-juju-latest.json
++
++
++Generating the Python Code
++--------------------------
++
++Once you have a new schema file, you can update the Python code
++using the `client` make target:
++
++.. code:: bash
++
++  make client
++
++You should expect to see updates to the `juju/client/_definitions.py` file,
++as well as one or more of the `juju/client/_clientX.py` files, depending on
++which facades were touched.
++
++
++Overrides
++---------
++
++It should be quite rare, but occasionally the generated Python code does
++not capture all of the logic needed to properly parse the output from the API
++or may otherwise need some small amount of tweaking.  This is what the
++`juju/client/overrides.py` file is for.  An example of this is the `Number`
++type, which isn't standard JSON and must be parsed slightly differently.
++
++At the top of that file are two lists, `__all__` and `__patches__`.  The
++former replaces entire class implementations, while the latter patches
++the attributes of the override classes into the matching generated class,
++leaving the rest of the generated class untouched.
++
++
++.. _SchemaGen: https://github.com/juju/schemagen
index 0000000,0000000..0f25647
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,50 @@@
++"""
++This example:
++
++1. Connects to current model and resets it.
++2. Deploys a git unit.
++3. Runs an action against the unit.
++4. Waits for the action results to come back, then exits.
++
++"""
++import asyncio
++import logging
++
++from juju import loop
++from juju.model import Model
++
++
++async def run_action(unit):
++    logging.debug('Running action on unit %s', unit.name)
++
++    # unit.run() returns a juju.action.Action instance
++    action = await unit.run_action('add-repo', repo='myrepo')
++    # wait for the action to complete
++    action = await action.wait()
++
++    logging.debug("Action results: %s", action.results)
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++    await model.reset(force=True)
++
++    app = await model.deploy(
++        'git',
++        application_name='git',
++        series='trusty',
++        channel='stable',
++    )
++
++    for unit in app.units:
++        await run_action(unit)
++
++    await model.disconnect()
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..8ae2d40
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,70 @@@
++#!/usr/bin/env python3.5
++
++"""
++This example:
++
++1. Connects to the current model
++2. Creates two machines and a lxd container
++3. Deploys charm to the lxd container
++
++"""
++import logging
++
++from juju import loop
++from juju.model import Model
++
++MB = 1
++GB = 1024
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++
++    try:
++        # add a new default machine
++        machine1 = await model.add_machine()
++        # add a machine with constraints, disks, and series
++        machine2 = await model.add_machine(
++            constraints={
++                'mem': 256 * MB,
++            },
++            disks=[{
++                'pool': 'rootfs',
++                'size': 10 * GB,
++                'count': 1,
++            }],
++            series='xenial',
++        )
++        # add a lxd container to machine2
++        machine3 = await model.add_machine(
++            'lxd:{}'.format(machine2.id))
++
++        # deploy charm to the lxd container
++        application = await model.deploy(
++            'ubuntu-10',
++            application_name='ubuntu',
++            series='xenial',
++            channel='stable',
++            to=machine3.id
++        )
++
++        await model.block_until(
++            lambda: all(unit.workload_status == 'active'
++                        for unit in application.units))
++
++        await application.remove()
++
++        await machine3.destroy(force=True)
++        await machine2.destroy(force=True)
++        await machine1.destroy(force=True)
++    finally:
++        await model.disconnect()
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++
++    loop.run(main())
index 0000000,0000000..3e46490
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,66 @@@
++"""
++This example:
++
++1. Creates a model on the current controller
++2. Deploys a charm to it.
++3. Attempts to ssh into the charm
++
++"""
++from juju import loop
++from juju import utils
++from juju.controller import Controller
++import asyncio
++from logging import getLogger
++import uuid
++
++LOG = getLogger(__name__)
++
++
++async def main():
++    controller = Controller()
++    print("Connecting to controller")
++    await controller.connect_current()
++
++    try:
++        model_name = "addmodeltest-{}".format(uuid.uuid4())
++        print("Adding model {}".format(model_name))
++        model = await controller.add_model(model_name)
++
++        print('Deploying ubuntu')
++        application = await model.deploy(
++            'ubuntu-10',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++
++        print('Waiting for active')
++        await asyncio.sleep(10)
++        await model.block_until(
++            lambda: all(unit.workload_status == 'active'
++                        for unit in application.units))
++
++        print("Verifying that we can ssh into the created model")
++        ret = await utils.execute_process(
++            'juju', 'ssh', '-m', model_name, 'ubuntu/0', 'ls /', log=LOG)
++        assert ret
++
++        print('Removing ubuntu')
++        await application.remove()
++
++        print("Destroying model")
++        await controller.destroy_model(model.info.uuid)
++
++    except Exception:
++        LOG.exception(
++            "Test failed! Model {} may not be cleaned up".format(model_name))
++
++    finally:
++        print('Disconnecting from controller')
++        if model:
++            await model.disconnect()
++        await controller.disconnect()
++
++
++if __name__ == '__main__':
++    loop.run(main())
index 0000000,0000000..c78d689
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++"""
++This example:
++
++1. Connects to the current model
++2. Starts an AllWatcher
++3. Prints all changes received from the AllWatcher
++4. Runs forever (kill with Ctrl-C)
++
++"""
++import asyncio
++import logging
++
++from juju.client.connection import Connection
++from juju.client import client
++from juju import loop
++
++
++async def watch():
++    conn = await Connection.connect_current()
++    allwatcher = client.AllWatcherFacade.from_connection(conn)
++    while True:
++        change = await allwatcher.Next()
++        for delta in change.deltas:
++            print(delta.deltas)
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    # Run loop until the process is manually stopped (watch will loop
++    # forever).
++    loop.run(watch())
index 0000000,0000000..bacc840
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,55 @@@
++"""
++This example:
++
++1. Connects to the current model
++2. Resets it
++3. Deploys a charm and prints its config and constraints
++
++"""
++import asyncio
++import logging
++
++from juju.model import Model
++from juju import loop
++
++log = logging.getLogger(__name__)
++
++MB = 1
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++    await model.reset(force=True)
++
++    ubuntu_app = await model.deploy(
++        'mysql',
++        application_name='mysql',
++        series='trusty',
++        channel='stable',
++        config={
++            'tuning-level': 'safest',
++        },
++        constraints={
++            'mem': 256 * MB,
++        },
++    )
++
++    # update and check app config
++    await ubuntu_app.set_config({'tuning-level': 'fast'})
++    config = await ubuntu_app.get_config()
++    assert(config['tuning-level']['value'] == 'fast')
++
++    # update and check app constraints
++    await ubuntu_app.set_constraints({'mem': 512 * MB})
++    constraints = await ubuntu_app.get_constraints()
++    assert(constraints['mem'] == 512 * MB)
++
++    await model.disconnect()
++
++    
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..6002f68
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++"""
++This example:
++
++1. Connects to current controller.
++2. Creates a new model.
++3. Deploys an application on the new model.
++4. Disconnects from the model
++5. Destroys the model
++
++"""
++import asyncio
++import logging
++
++from juju.controller import Controller
++from juju import loop
++
++
++async def main():
++    controller = Controller()
++    await controller.connect_current()
++    model = await controller.add_model(
++        'my-test-model',
++        'aws',
++        'aws-tim',
++    )
++    await model.deploy(
++        'ubuntu-0',
++        application_name='ubuntu',
++        series='trusty',
++        channel='stable',
++    )
++    await model.disconnect()
++    await controller.destroy_model(model.info.uuid)
++    await controller.disconnect()
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..e6c306a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,40 @@@
++"""
++This example:
++
++1. Connects to the current model
++2. Deploy a charm and waits until it reports itself active
++3. Destroys the unit and application
++
++"""
++from juju import loop
++from juju.model import Model
++
++
++async def main():
++    model = Model()
++    print('Connecting to model')
++    await model.connect_current()
++
++    try:
++        print('Deploying ubuntu')
++        application = await model.deploy(
++            'ubuntu-10',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++
++        print('Waiting for active')
++        await model.block_until(
++            lambda: all(unit.workload_status == 'active'
++                        for unit in application.units))
++
++        print('Removing ubuntu')
++        await application.remove()
++    finally:
++        print('Disconnecting from model')
++        await model.disconnect()
++
++
++if __name__ == '__main__':
++    loop.run(main())
index 0000000,0000000..cdaf51d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,23 @@@
++import asyncio
++
++from juju.client.connection import Connection
++from juju.client.client import ClientFacade
++from juju import loop
++
++async def status():
++    conn = await Connection.connect_current()
++    client = ClientFacade.from_connection(conn)
++
++    patterns = None
++    status = await client.FullStatus(patterns)
++    await conn.close()
++
++    print('Applications:', list(status.applications.keys()))
++    print('Machines:', list(status.machines.keys()))
++    print('Relations:', status.relations)
++
++    return status
++
++if __name__ == '__main__':
++    loop.run(status())
++
index 0000000,0000000..0180325
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,48 @@@
++"""
++This example doesn't work - it demonstrates features that don't exist yet.
++
++"""
++import asyncio
++import logging
++
++from juju.model import Model
++from juju import loop
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++    await model.reset(force=True)
++
++    goal_state = Model.from_yaml('bundle-like-thing')
++    ubuntu_app = await model.deploy(
++        'ubuntu-0',
++        application_name='ubuntu',
++        series='trusty',
++        channel='stable',
++    )
++    ubuntu_app.on_unit_added(callback=lambda unit: True)
++
++    await model.deploy(
++        'nrpe-11',
++        application_name='nrpe',
++        series='trusty',
++        channel='stable',
++        num_units=0,
++    )
++    await model.add_relation(
++        'ubuntu',
++        'nrpe',
++    )
++
++    result, ok = await model.block_until(
++        lambda: model.matches(goal_state),
++        timeout=600
++    )
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..b231003
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++"""
++This example:
++
++1. Connects to the current model.
++2. Prints out leadership status for all deployed units in the model.
++3. Cleanly disconnects.
++
++"""
++import asyncio
++
++from juju.model import Model
++from juju import loop
++
++async def report_leadership():
++    model = Model()
++    await model.connect_current()
++
++    print("Leadership: ")
++    for app in model.applications.values():
++        for unit in app.units:
++            print("{}: {}".format(
++                unit.name, await unit.is_leader_from_status()))
++
++    await model.disconnect()
++
++
++if __name__ == '__main__':
++    loop.run(report_leadership())
index 0000000,0000000..47eb999
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,32 @@@
++"""
++This example:
++
++1. Connects to the current model
++2. Watches the model and prints all changes
++3. Runs forever (kill with Ctrl-C)
++
++"""
++import asyncio
++
++from juju.model import Model
++from juju import loop
++
++
++async def on_model_change(delta, old, new, model):
++    print(delta.entity, delta.type, delta.data)
++    print(old)
++    print(new)
++    print(model)
++
++
++async def watch_model():
++    model = Model()
++    await model.connect_current()
++
++    model.add_observer(on_model_change)
++
++
++if __name__ == '__main__':
++    # Run loop until the process is manually stopped (watch_model will loop
++    # forever).
++    loop.run(watch_model())
index 0000000,0000000..978703e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,34 @@@
++"""
++This example shows how to deploy a local charm. It:
++
++1. Connects to current model.
++2. Uploads a local charm (directory on filesystem) to the model.
++3. Deploys the uploaded charm.
++
++"""
++import asyncio
++import logging
++
++from juju.model import Model
++from juju import loop
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++
++    # Deploy a local charm using a path to the charm directory
++    await model.deploy(
++        '/home/tvansteenburgh/src/charms/ubuntu',
++        application_name='ubuntu',
++        series='trusty',
++    )
++
++    await model.disconnect()
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..8f1e708
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,98 @@@
++"""
++This example:
++
++1. Connects to the current model
++2. Resets it
++3. Deploys two charms and relates them
++4. Waits for units to be idle, then exits
++
++"""
++import asyncio
++import logging
++
++from juju.model import Model, ModelObserver
++from juju import loop
++
++
++class MyRemoveObserver(ModelObserver):
++    async def on_change(self, delta, old, new, model):
++        if delta.type == 'remove':
++            assert(new.latest() == new)
++            assert(new.next() is None)
++            assert(new.dead)
++            assert(new.current)
++            assert(new.connected)
++            assert(new.previous().dead)
++            assert(not new.previous().current)
++            assert(not new.previous().connected)
++
++
++class MyModelObserver(ModelObserver):
++    _shutting_down = False
++
++    async def on_change(self, delta, old, new, model):
++        if model.units and model.all_units_idle() and not self._shutting_down:
++            self._shutting_down = True
++            logging.debug('All units idle, disconnecting')
++            await model.reset(force=True)
++            await model.disconnect()
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++
++    model.add_observer(MyRemoveObserver())
++    await model.reset(force=True)
++    model.add_observer(MyModelObserver())
++
++    ubuntu_app = await model.deploy(
++        'ubuntu',
++        application_name='ubuntu',
++        series='trusty',
++        channel='stable',
++    )
++    ubuntu_app.on_change(asyncio.coroutine(
++        lambda delta, old_app, new_app, model:
++            print('App changed: {}'.format(new_app.entity_id))
++    ))
++    ubuntu_app.on_remove(asyncio.coroutine(
++        lambda delta, old_app, new_app, model:
++            print('App removed: {}'.format(old_app.entity_id))
++    ))
++    ubuntu_app.on_unit_add(asyncio.coroutine(
++        lambda delta, old_unit, new_unit, model:
++            print('Unit added: {}'.format(new_unit.entity_id))
++    ))
++    ubuntu_app.on_unit_remove(asyncio.coroutine(
++        lambda delta, old_unit, new_unit, model:
++            print('Unit removed: {}'.format(old_unit.entity_id))
++    ))
++    unit_a, unit_b = await ubuntu_app.add_units(count=2)
++    unit_a.on_change(asyncio.coroutine(
++        lambda delta, old_unit, new_unit, model:
++            print('Unit changed: {}'.format(new_unit.entity_id))
++    ))
++    await model.deploy(
++        'nrpe',
++        application_name='nrpe',
++        series='trusty',
++        channel='stable',
++        # subordinates must be deployed without units
++        num_units=0,
++    )
++    my_relation = await model.add_relation(
++        'ubuntu',
++        'nrpe',
++    )
++    my_relation.on_remove(asyncio.coroutine(
++        lambda delta, old_rel, new_rel, model:
++            print('Relation removed: {}'.format(old_rel.endpoints))
++    ))
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..3dfacd6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,47 @@@
++"""
++This example:
++
++1. Connects to current model and resets it.
++2. Deploys one ubuntu unit.
++3. Runs an action against the unit.
++4. Waits for the action results to come back, then exits.
++
++"""
++import asyncio
++import logging
++
++from juju.model import Model
++from juju import loop
++
++
++async def run_command(unit):
++    logging.debug('Running command on unit %s', unit.name)
++
++    # unit.run() returns a juju.action.Action instance
++    action = await unit.run('unit-get public-address')
++    logging.debug("Action results: %s", action.results)
++
++
++async def main():
++    model = Model()
++    await model.connect_current()
++    await model.reset(force=True)
++
++    app = await model.deploy(
++        'ubuntu-0',
++        application_name='ubuntu',
++        series='trusty',
++        channel='stable',
++    )
++
++    for unit in app.units:
++        await run_command(unit)
++
++    await model.disconnect()
++
++
++if __name__ == '__main__':
++    logging.basicConfig(level=logging.DEBUG)
++    ws_logger = logging.getLogger('websockets.protocol')
++    ws_logger.setLevel(logging.INFO)
++    loop.run(main())
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..7a136a7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,10 @@@
++from . import model
++
++
++class Action(model.ModelEntity):
++    @property
++    def status(self):
++        return self.data['status']
++
++    async def wait(self):
++        return await self.model.wait_for_action(self.id)
index 0000000,0000000..73c9b1c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++import logging
++
++from . import model
++
++log = logging.getLogger(__name__)
++
++
++class Annotation(model.ModelEntity):
++    pass
index 0000000,0000000..8719a62
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,391 @@@
++import asyncio
++import logging
++
++from . import model
++from .client import client
++from .errors import JujuError
++from .placement import parse as parse_placement
++
++log = logging.getLogger(__name__)
++
++
++class Application(model.ModelEntity):
++    @property
++    def _unit_match_pattern(self):
++        return r'^{}.*$'.format(self.entity_id)
++
++    def on_unit_add(self, callable_):
++        """Add a "unit added" observer to this entity, which will be called
++        whenever a unit is added to this application.
++
++        """
++        self.model.add_observer(
++            callable_, 'unit', 'add', self._unit_match_pattern)
++
++    def on_unit_remove(self, callable_):
++        """Add a "unit removed" observer to this entity, which will be called
++        whenever a unit is removed from this application.
++
++        """
++        self.model.add_observer(
++            callable_, 'unit', 'remove', self._unit_match_pattern)
++
++    @property
++    def units(self):
++        return [
++            unit for unit in self.model.units.values()
++            if unit.application == self.name
++        ]
++
++    @property
++    def status(self):
++        """Get the application status, as set by the charm's leader.
++
++        """
++        return self.safe_data['status']['current']
++
++    @property
++    def status_message(self):
++        """Get the application status message, as set by the charm's leader.
++
++        """
++        return self.safe_data['status']['message']
++
++    @property
++    def tag(self):
++        return 'application-%s' % self.name
++
++    async def add_relation(self, local_relation, remote_relation):
++        """Add a relation to another application.
++
++        :param str local_relation: Name of relation on this application
++        :param str remote_relation: Name of relation on the other
++            application in the form '<application>[:<relation_name>]'
++
++        """
++        if ':' not in local_relation:
++            local_relation = '{}:{}'.format(self.name, local_relation)
++
++        return await self.model.add_relation(local_relation, remote_relation)
++
++    async def add_unit(self, count=1, to=None):
++        """Add one or more units to this application.
++
++        :param int count: Number of units to add
++        :param str to: Placement directive, e.g.::
++            '23' - machine 23
++            'lxc:7' - new lxc container on machine 7
++            '24/lxc/3' - lxc container 3 or machine 24
++
++            If None, a new machine is provisioned.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Adding %s unit%s to %s',
++            count, '' if count == 1 else 's', self.name)
++
++        result = await app_facade.AddUnits(
++            application=self.name,
++            placement=parse_placement(to) if to else None,
++            num_units=count,
++        )
++
++        return await asyncio.gather(*[
++            asyncio.ensure_future(self.model._wait_for_new('unit', unit_id))
++            for unit_id in result.units
++        ])
++
++    add_units = add_unit
++
++    def allocate(self, budget, value):
++        """Allocate budget to this application.
++
++        :param str budget: Name of budget
++        :param int value: Budget limit
++
++        """
++        raise NotImplementedError()
++
++    def attach(self, resource_name, file_path):
++        """Upload a file as a resource for this application.
++
++        :param str resource: Name of the resource
++        :param str file_path: Path to the file to upload
++
++        """
++        raise NotImplementedError()
++
++    def collect_metrics(self):
++        """Collect metrics on this application.
++
++        """
++        raise NotImplementedError()
++
++    async def destroy_relation(self, local_relation, remote_relation):
++        """Remove a relation to another application.
++
++        :param str local_relation: Name of relation on this application
++        :param str remote_relation: Name of relation on the other
++            application in the form '<application>[:<relation_name>]'
++
++        """
++        if ':' not in local_relation:
++            local_relation = '{}:{}'.format(self.name, local_relation)
++
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Destroying relation %s <-> %s', local_relation, remote_relation)
++
++        return await app_facade.DestroyRelation([
++            local_relation, remote_relation])
++    remove_relation = destroy_relation
++
++    async def destroy_unit(self, *unit_names):
++        """Destroy units by name.
++
++        """
++        return await self.model.destroy_units(*unit_names)
++    destroy_units = destroy_unit
++
++    async def destroy(self):
++        """Remove this application from the model.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Destroying %s', self.name)
++
++        return await app_facade.Destroy(self.name)
++    remove = destroy
++
++    async def expose(self):
++        """Make this application publicly available over the network.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Exposing %s', self.name)
++
++        return await app_facade.Expose(self.name)
++
++    async def get_config(self):
++        """Return the configuration settings dict for this application.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Getting config for %s', self.name)
++
++        return (await app_facade.Get(self.name)).config
++
++    async def get_constraints(self):
++        """Return the machine constraints dict for this application.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Getting constraints for %s', self.name)
++
++        result = (await app_facade.Get(self.name)).constraints
++        return vars(result) if result else result
++
++    def get_actions(self, schema=False):
++        """Get actions defined for this application.
++
++        :param bool schema: Return the full action schema
++
++        """
++        raise NotImplementedError()
++
++    def get_resources(self, details=False):
++        """Return resources for this application.
++
++        :param bool details: Include detailed info about resources used by each
++            unit
++
++        """
++        raise NotImplementedError()
++
++    async def run(self, command, timeout=None):
++        """Run command on all units for this application.
++
++        :param str command: The command to run
++        :param int timeout: Time to wait before command is considered failed
++
++        """
++        action = client.ActionFacade.from_connection(self.connection)
++
++        log.debug(
++            'Running `%s` on all units of %s', command, self.name)
++
++        # TODO this should return a list of Actions
++        return await action.Run(
++            [self.name],
++            command,
++            [],
++            timeout,
++            [],
++        )
++
++    async def set_annotations(self, annotations):
++        """Set annotations on this application.
++
++        :param annotations map[string]string: the annotations as key/value
++            pairs.
++
++        """
++        log.debug('Updating annotations on application %s', self.name)
++
++        self.ann_facade = client.AnnotationsFacade.from_connection(
++            self.connection)
++
++        ann = client.EntityAnnotations(
++            entity=self.tag,
++            annotations=annotations,
++        )
++        return await self.ann_facade.Set([ann])
++
++    async def set_config(self, config, to_default=False):
++        """Set configuration options for this application.
++
++        :param config: Dict of configuration to set
++        :param bool to_default: Set application options to default values
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Setting config for %s: %s', self.name, config)
++
++        return await app_facade.Set(self.name, config)
++
++    async def set_constraints(self, constraints):
++        """Set machine constraints for this application.
++
++        :param dict constraints: Dict of machine constraints
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Setting constraints for %s: %s', self.name, constraints)
++
++        return await app_facade.SetConstraints(self.name, constraints)
++
++    def set_meter_status(self, status, info=None):
++        """Set the meter status on this status.
++
++        :param str status: Meter status, e.g. 'RED', 'AMBER'
++        :param str info: Extra info message
++
++        """
++        raise NotImplementedError()
++
++    def set_plan(self, plan_name):
++        """Set the plan for this application, effective immediately.
++
++        :param str plan_name: Name of plan
++
++        """
++        raise NotImplementedError()
++
++    async def unexpose(self):
++        """Remove public availability over the network for this application.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Unexposing %s', self.name)
++
++        return await app_facade.Unexpose(self.name)
++
++    def update_allocation(self, allocation):
++        """Update existing allocation for this application.
++
++        :param int allocation: The allocation to set
++
++        """
++        raise NotImplementedError()
++
++    async def upgrade_charm(
++            self, channel=None, force_series=False, force_units=False,
++            path=None, resources=None, revision=None, switch=None):
++        """Upgrade the charm for this application.
++
++        :param str channel: Channel to use when getting the charm from the
++            charm store, e.g. 'development'
++        :param bool force_series: Upgrade even if series of deployed
++            application is not supported by the new charm
++        :param bool force_units: Upgrade all units immediately, even if in
++            error state
++        :param str path: Uprade to a charm located at path
++        :param dict resources: Dictionary of resource name/filepath pairs
++        :param int revision: Explicit upgrade revision
++        :param str switch: Crossgrade charm url
++
++        """
++        # TODO: Support local upgrades
++        if path is not None:
++            raise NotImplementedError("path option is not implemented")
++        if resources is not None:
++            raise NotImplementedError("resources option is not implemented")
++
++        if switch is not None and revision is not None:
++            raise ValueError("switch and revision are mutually exclusive")
++
++        client_facade = client.ClientFacade.from_connection(self.connection)
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        if switch is not None:
++            charm_url = switch
++            if not charm_url.startswith('cs:'):
++                charm_url = 'cs:' + charm_url
++        else:
++            charm_url = self.data['charm-url']
++            charm_url = charm_url.rpartition('-')[0]
++            if revision is not None:
++                charm_url = "%s-%d" % (charm_url, revision)
++            else:
++                charmstore = self.model.charmstore
++                entity = await charmstore.entity(charm_url, channel=channel)
++                charm_url = entity['Id']
++
++        if charm_url == self.data['charm-url']:
++            raise JujuError('already running charm "%s"' % charm_url)
++
++        await client_facade.AddCharm(
++            url=charm_url,
++            channel=channel
++        )
++
++        await app_facade.SetCharm(
++            application=self.entity_id,
++            channel=channel,
++            charm_url=charm_url,
++            config_settings=None,
++            config_settings_yaml=None,
++            force_series=force_series,
++            force_units=force_units,
++            resource_ids=None,
++            storage_constraints=None
++        )
++
++        await self.model.block_until(
++            lambda: self.data['charm-url'] == charm_url
++        )
++
++    async def get_metrics(self):
++        """Get metrics for this application's units.
++
++        :return: Dictionary of unit_name:metrics
++
++        """
++        return await self.model.get_metrics(self.tag)
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..d510e11
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,367 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client._definitions import *
++
++from juju.client import _client1, _client2, _client3, _client4, _client5
++
++
++CLIENTS = {
++    "1": _client1,
++    "2": _client2,
++    "3": _client3,
++    "4": _client4,
++    "5": _client5
++}
++
++
++
++def lookup_facade(name, version):
++        """
++        Given a facade name and version, attempt to pull that facade out
++        of the correct client<version>.py file.
++
++        """
++        try:
++            facade = getattr(CLIENTS[str(version)], name)
++        except KeyError:
++            raise ImportError("No facades found for version {}".format(version))
++        except AttributeError:
++            raise ImportError(
++                "No facade with name '{}' in version {}".format(name, version))
++        return facade
++
++
++
++class TypeFactory:
++    @classmethod
++    def from_connection(cls, connection):
++        """
++        Given a connected Connection object, return an initialized and
++        connected instance of an API Interface matching the name of
++        this class.
++
++        @param connection: initialized Connection object.
++
++        """
++        version = connection.facades[cls.__name__[:-6]]
++
++        c = lookup_facade(cls.__name__, version)
++        c = c()
++        c.connect(connection)
++
++        return c
++
++
++class ActionFacade(TypeFactory):
++    pass
++
++
++class AgentFacade(TypeFactory):
++    pass
++
++
++class AgentToolsFacade(TypeFactory):
++    pass
++
++
++class AllModelWatcherFacade(TypeFactory):
++    pass
++
++
++class AllWatcherFacade(TypeFactory):
++    pass
++
++
++class AnnotationsFacade(TypeFactory):
++    pass
++
++
++class ApplicationFacade(TypeFactory):
++    pass
++
++
++class ApplicationRelationsWatcherFacade(TypeFactory):
++    pass
++
++
++class ApplicationScalerFacade(TypeFactory):
++    pass
++
++
++class BackupsFacade(TypeFactory):
++    pass
++
++
++class BlockFacade(TypeFactory):
++    pass
++
++
++class BundleFacade(TypeFactory):
++    pass
++
++
++class CharmRevisionUpdaterFacade(TypeFactory):
++    pass
++
++
++class CharmsFacade(TypeFactory):
++    pass
++
++
++class CleanerFacade(TypeFactory):
++    pass
++
++
++class ClientFacade(TypeFactory):
++    pass
++
++
++class CloudFacade(TypeFactory):
++    pass
++
++
++class ControllerFacade(TypeFactory):
++    pass
++
++
++class DeployerFacade(TypeFactory):
++    pass
++
++
++class DiscoverSpacesFacade(TypeFactory):
++    pass
++
++
++class DiskManagerFacade(TypeFactory):
++    pass
++
++
++class EntityWatcherFacade(TypeFactory):
++    pass
++
++
++class FilesystemAttachmentsWatcherFacade(TypeFactory):
++    pass
++
++
++class FirewallerFacade(TypeFactory):
++    pass
++
++
++class HighAvailabilityFacade(TypeFactory):
++    pass
++
++
++class HostKeyReporterFacade(TypeFactory):
++    pass
++
++
++class ImageManagerFacade(TypeFactory):
++    pass
++
++
++class ImageMetadataFacade(TypeFactory):
++    pass
++
++
++class InstancePollerFacade(TypeFactory):
++    pass
++
++
++class KeyManagerFacade(TypeFactory):
++    pass
++
++
++class KeyUpdaterFacade(TypeFactory):
++    pass
++
++
++class LeadershipServiceFacade(TypeFactory):
++    pass
++
++
++class LifeFlagFacade(TypeFactory):
++    pass
++
++
++class LogForwardingFacade(TypeFactory):
++    pass
++
++
++class LoggerFacade(TypeFactory):
++    pass
++
++
++class MachineActionsFacade(TypeFactory):
++    pass
++
++
++class MachineManagerFacade(TypeFactory):
++    pass
++
++
++class MachineUndertakerFacade(TypeFactory):
++    pass
++
++
++class MachinerFacade(TypeFactory):
++    pass
++
++
++class MeterStatusFacade(TypeFactory):
++    pass
++
++
++class MetricsAdderFacade(TypeFactory):
++    pass
++
++
++class MetricsDebugFacade(TypeFactory):
++    pass
++
++
++class MetricsManagerFacade(TypeFactory):
++    pass
++
++
++class MigrationFlagFacade(TypeFactory):
++    pass
++
++
++class MigrationMasterFacade(TypeFactory):
++    pass
++
++
++class MigrationMinionFacade(TypeFactory):
++    pass
++
++
++class MigrationStatusWatcherFacade(TypeFactory):
++    pass
++
++
++class MigrationTargetFacade(TypeFactory):
++    pass
++
++
++class ModelConfigFacade(TypeFactory):
++    pass
++
++
++class ModelManagerFacade(TypeFactory):
++    pass
++
++
++class NotifyWatcherFacade(TypeFactory):
++    pass
++
++
++class PayloadsFacade(TypeFactory):
++    pass
++
++
++class PayloadsHookContextFacade(TypeFactory):
++    pass
++
++
++class PingerFacade(TypeFactory):
++    pass
++
++
++class ProvisionerFacade(TypeFactory):
++    pass
++
++
++class ProxyUpdaterFacade(TypeFactory):
++    pass
++
++
++class RebootFacade(TypeFactory):
++    pass
++
++
++class RelationUnitsWatcherFacade(TypeFactory):
++    pass
++
++
++class RemoteApplicationWatcherFacade(TypeFactory):
++    pass
++
++
++class RemoteRelationsWatcherFacade(TypeFactory):
++    pass
++
++
++class ResourcesFacade(TypeFactory):
++    pass
++
++
++class ResourcesHookContextFacade(TypeFactory):
++    pass
++
++
++class ResumerFacade(TypeFactory):
++    pass
++
++
++class RetryStrategyFacade(TypeFactory):
++    pass
++
++
++class SSHClientFacade(TypeFactory):
++    pass
++
++
++class SingularFacade(TypeFactory):
++    pass
++
++
++class SpacesFacade(TypeFactory):
++    pass
++
++
++class StatusHistoryFacade(TypeFactory):
++    pass
++
++
++class StorageFacade(TypeFactory):
++    pass
++
++
++class StorageProvisionerFacade(TypeFactory):
++    pass
++
++
++class StringsWatcherFacade(TypeFactory):
++    pass
++
++
++class SubnetsFacade(TypeFactory):
++    pass
++
++
++class UndertakerFacade(TypeFactory):
++    pass
++
++
++class UnitAssignerFacade(TypeFactory):
++    pass
++
++
++class UniterFacade(TypeFactory):
++    pass
++
++
++class UpgraderFacade(TypeFactory):
++    pass
++
++
++class UserManagerFacade(TypeFactory):
++    pass
++
++
++class VolumeAttachmentsWatcherFacade(TypeFactory):
++    pass
++
++
index 0000000,0000000..3774056
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6645 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++from juju.client._definitions import *
++
++
++class AgentToolsFacade(Type):
++    name = 'AgentTools'
++    version = 1
++    schema =     {'properties': {'UpdateToolsAvailable': {'type': 'object'}}, 'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def UpdateToolsAvailable(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='AgentTools', request='UpdateToolsAvailable', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class AllWatcherFacade(Type):
++    name = 'AllWatcher'
++    version = 1
++    schema =     {'definitions': {'AllWatcherNextResults': {'additionalProperties': False,
++                                               'properties': {'deltas': {'items': {'$ref': '#/definitions/Delta'},
++                                                                         'type': 'array'}},
++                                               'required': ['deltas'],
++                                               'type': 'object'},
++                     'Delta': {'additionalProperties': False,
++                               'properties': {'entity': {'additionalProperties': True,
++                                                         'type': 'object'},
++                                              'removed': {'type': 'boolean'}},
++                               'required': ['removed', 'entity'],
++                               'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/AllWatcherNextResults'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AllWatcherNextResults)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~Delta]<~Delta>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='AllWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='AllWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ApplicationRelationsWatcherFacade(Type):
++    name = 'ApplicationRelationsWatcher'
++    version = 1
++    schema =     {'definitions': {'ApplicationRelationsChange': {'additionalProperties': False,
++                                                    'properties': {'changed': {'items': {'$ref': '#/definitions/RelationChange'},
++                                                                               'type': 'array'},
++                                                                   'removed': {'items': {'type': 'integer'},
++                                                                               'type': 'array'}},
++                                                    'type': 'object'},
++                     'ApplicationRelationsWatchResult': {'additionalProperties': False,
++                                                         'properties': {'ApplicationRelationsWatcherId': {'type': 'string'},
++                                                                        'changes': {'$ref': '#/definitions/ApplicationRelationsChange'},
++                                                                        'error': {'$ref': '#/definitions/Error'}},
++                                                         'required': ['ApplicationRelationsWatcherId'],
++                                                         'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'RelationChange': {'additionalProperties': False,
++                                        'properties': {'changedunits': {'patternProperties': {'.*': {'$ref': '#/definitions/RelationUnitChange'}},
++                                                                        'type': 'object'},
++                                                       'departedunits': {'items': {'type': 'string'},
++                                                                         'type': 'array'},
++                                                       'id': {'type': 'integer'},
++                                                       'life': {'type': 'string'}},
++                                        'required': ['id', 'life'],
++                                        'type': 'object'},
++                     'RelationUnitChange': {'additionalProperties': False,
++                                            'properties': {'settings': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                     'type': 'object'}},
++                                                                        'type': 'object'}},
++                                            'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/ApplicationRelationsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ApplicationRelationsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('ApplicationRelationsChange'), _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ApplicationRelationsWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ApplicationRelationsWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ApplicationScalerFacade(Type):
++    name = 'ApplicationScaler'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'}},
++     'properties': {'Rescale': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'Watch': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                              'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def Rescale(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ApplicationScaler', request='Rescale', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResult)
++    async def Watch(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ApplicationScaler', request='Watch', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class BackupsFacade(Type):
++    name = 'Backups'
++    version = 1
++    schema =     {'definitions': {'BackupsCreateArgs': {'additionalProperties': False,
++                                           'properties': {'notes': {'type': 'string'}},
++                                           'required': ['notes'],
++                                           'type': 'object'},
++                     'BackupsInfoArgs': {'additionalProperties': False,
++                                         'properties': {'id': {'type': 'string'}},
++                                         'required': ['id'],
++                                         'type': 'object'},
++                     'BackupsListArgs': {'additionalProperties': False,
++                                         'type': 'object'},
++                     'BackupsListResult': {'additionalProperties': False,
++                                           'properties': {'list': {'items': {'$ref': '#/definitions/BackupsMetadataResult'},
++                                                                   'type': 'array'}},
++                                           'required': ['list'],
++                                           'type': 'object'},
++                     'BackupsMetadataResult': {'additionalProperties': False,
++                                               'properties': {'ca-cert': {'type': 'string'},
++                                                              'ca-private-key': {'type': 'string'},
++                                                              'checksum': {'type': 'string'},
++                                                              'checksum-format': {'type': 'string'},
++                                                              'finished': {'format': 'date-time',
++                                                                           'type': 'string'},
++                                                              'hostname': {'type': 'string'},
++                                                              'id': {'type': 'string'},
++                                                              'machine': {'type': 'string'},
++                                                              'model': {'type': 'string'},
++                                                              'notes': {'type': 'string'},
++                                                              'series': {'type': 'string'},
++                                                              'size': {'type': 'integer'},
++                                                              'started': {'format': 'date-time',
++                                                                          'type': 'string'},
++                                                              'stored': {'format': 'date-time',
++                                                                         'type': 'string'},
++                                                              'version': {'$ref': '#/definitions/Number'}},
++                                               'required': ['id',
++                                                            'checksum',
++                                                            'checksum-format',
++                                                            'size',
++                                                            'stored',
++                                                            'started',
++                                                            'finished',
++                                                            'notes',
++                                                            'model',
++                                                            'machine',
++                                                            'hostname',
++                                                            'version',
++                                                            'series',
++                                                            'ca-cert',
++                                                            'ca-private-key'],
++                                               'type': 'object'},
++                     'BackupsRemoveArgs': {'additionalProperties': False,
++                                           'properties': {'id': {'type': 'string'}},
++                                           'required': ['id'],
++                                           'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'RestoreArgs': {'additionalProperties': False,
++                                     'properties': {'backup-id': {'type': 'string'}},
++                                     'required': ['backup-id'],
++                                     'type': 'object'}},
++     'properties': {'Create': {'properties': {'Params': {'$ref': '#/definitions/BackupsCreateArgs'},
++                                              'Result': {'$ref': '#/definitions/BackupsMetadataResult'}},
++                               'type': 'object'},
++                    'FinishRestore': {'type': 'object'},
++                    'Info': {'properties': {'Params': {'$ref': '#/definitions/BackupsInfoArgs'},
++                                            'Result': {'$ref': '#/definitions/BackupsMetadataResult'}},
++                             'type': 'object'},
++                    'List': {'properties': {'Params': {'$ref': '#/definitions/BackupsListArgs'},
++                                            'Result': {'$ref': '#/definitions/BackupsListResult'}},
++                             'type': 'object'},
++                    'PrepareRestore': {'type': 'object'},
++                    'Remove': {'properties': {'Params': {'$ref': '#/definitions/BackupsRemoveArgs'}},
++                               'type': 'object'},
++                    'Restore': {'properties': {'Params': {'$ref': '#/definitions/RestoreArgs'}},
++                                'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(BackupsMetadataResult)
++    async def Create(self, notes):
++        '''
++        notes : str
++        Returns -> typing.Union[str, int, _ForwardRef('Number')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='Create', version=1, params=_params)
++        _params['notes'] = notes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def FinishRestore(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='FinishRestore', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BackupsMetadataResult)
++    async def Info(self, id_):
++        '''
++        id_ : str
++        Returns -> typing.Union[str, int, _ForwardRef('Number')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='Info', version=1, params=_params)
++        _params['id'] = id_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BackupsListResult)
++    async def List(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~BackupsMetadataResult]<~BackupsMetadataResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='List', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def PrepareRestore(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='PrepareRestore', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Remove(self, id_):
++        '''
++        id_ : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='Remove', version=1, params=_params)
++        _params['id'] = id_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Restore(self, backup_id):
++        '''
++        backup_id : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Backups', request='Restore', version=1, params=_params)
++        _params['backup-id'] = backup_id
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class BundleFacade(Type):
++    name = 'Bundle'
++    version = 1
++    schema =     {'definitions': {'BundleChange': {'additionalProperties': False,
++                                      'properties': {'args': {'items': {'additionalProperties': True,
++                                                                        'type': 'object'},
++                                                              'type': 'array'},
++                                                     'id': {'type': 'string'},
++                                                     'method': {'type': 'string'},
++                                                     'requires': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                      'required': ['id',
++                                                   'method',
++                                                   'args',
++                                                   'requires'],
++                                      'type': 'object'},
++                     'BundleChangesParams': {'additionalProperties': False,
++                                             'properties': {'yaml': {'type': 'string'}},
++                                             'required': ['yaml'],
++                                             'type': 'object'},
++                     'BundleChangesResults': {'additionalProperties': False,
++                                              'properties': {'changes': {'items': {'$ref': '#/definitions/BundleChange'},
++                                                                         'type': 'array'},
++                                                             'errors': {'items': {'type': 'string'},
++                                                                        'type': 'array'}},
++                                              'type': 'object'}},
++     'properties': {'GetChanges': {'properties': {'Params': {'$ref': '#/definitions/BundleChangesParams'},
++                                                  'Result': {'$ref': '#/definitions/BundleChangesResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(BundleChangesResults)
++    async def GetChanges(self, yaml):
++        '''
++        yaml : str
++        Returns -> typing.Sequence<+T_co>[~BundleChange]<~BundleChange>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Bundle', request='GetChanges', version=1, params=_params)
++        _params['yaml'] = yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ClientFacade(Type):
++    name = 'Client'
++    version = 1
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'AddCharm': {'additionalProperties': False,
++                                  'properties': {'channel': {'type': 'string'},
++                                                 'url': {'type': 'string'}},
++                                  'required': ['url', 'channel'],
++                                  'type': 'object'},
++                     'AddCharmWithAuthorization': {'additionalProperties': False,
++                                                   'properties': {'channel': {'type': 'string'},
++                                                                  'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                                  'url': {'type': 'string'}},
++                                                   'required': ['url',
++                                                                'channel',
++                                                                'macaroon'],
++                                                   'type': 'object'},
++                     'AddMachineParams': {'additionalProperties': False,
++                                          'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                       'type': 'array'},
++                                                         'constraints': {'$ref': '#/definitions/Value'},
++                                                         'container-type': {'type': 'string'},
++                                                         'disks': {'items': {'$ref': '#/definitions/Constraints'},
++                                                                   'type': 'array'},
++                                                         'hardware-characteristics': {'$ref': '#/definitions/HardwareCharacteristics'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'jobs': {'items': {'type': 'string'},
++                                                                  'type': 'array'},
++                                                         'nonce': {'type': 'string'},
++                                                         'parent-id': {'type': 'string'},
++                                                         'placement': {'$ref': '#/definitions/Placement'},
++                                                         'series': {'type': 'string'}},
++                                          'required': ['series',
++                                                       'constraints',
++                                                       'jobs',
++                                                       'parent-id',
++                                                       'container-type',
++                                                       'instance-id',
++                                                       'nonce',
++                                                       'hardware-characteristics',
++                                                       'addresses'],
++                                          'type': 'object'},
++                     'AddMachines': {'additionalProperties': False,
++                                     'properties': {'params': {'items': {'$ref': '#/definitions/AddMachineParams'},
++                                                               'type': 'array'}},
++                                     'required': ['params'],
++                                     'type': 'object'},
++                     'AddMachinesResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'machine': {'type': 'string'}},
++                                           'required': ['machine'],
++                                           'type': 'object'},
++                     'AddMachinesResults': {'additionalProperties': False,
++                                            'properties': {'machines': {'items': {'$ref': '#/definitions/AddMachinesResult'},
++                                                                        'type': 'array'}},
++                                            'required': ['machines'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'AgentVersionResult': {'additionalProperties': False,
++                                            'properties': {'version': {'$ref': '#/definitions/Number'}},
++                                            'required': ['version'],
++                                            'type': 'object'},
++                     'AllWatcherId': {'additionalProperties': False,
++                                      'properties': {'watcher-id': {'type': 'string'}},
++                                      'required': ['watcher-id'],
++                                      'type': 'object'},
++                     'ApplicationStatus': {'additionalProperties': False,
++                                           'properties': {'can-upgrade-to': {'type': 'string'},
++                                                          'charm': {'type': 'string'},
++                                                          'err': {'additionalProperties': True,
++                                                                  'type': 'object'},
++                                                          'exposed': {'type': 'boolean'},
++                                                          'life': {'type': 'string'},
++                                                          'meter-statuses': {'patternProperties': {'.*': {'$ref': '#/definitions/MeterStatus'}},
++                                                                             'type': 'object'},
++                                                          'relations': {'patternProperties': {'.*': {'items': {'type': 'string'},
++                                                                                                     'type': 'array'}},
++                                                                        'type': 'object'},
++                                                          'series': {'type': 'string'},
++                                                          'status': {'$ref': '#/definitions/DetailedStatus'},
++                                                          'subordinate-to': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                          'units': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitStatus'}},
++                                                                    'type': 'object'},
++                                                          'workload-version': {'type': 'string'}},
++                                           'required': ['charm',
++                                                        'series',
++                                                        'exposed',
++                                                        'life',
++                                                        'relations',
++                                                        'can-upgrade-to',
++                                                        'subordinate-to',
++                                                        'units',
++                                                        'meter-statuses',
++                                                        'status',
++                                                        'workload-version'],
++                                           'type': 'object'},
++                     'Binary': {'additionalProperties': False,
++                                'properties': {'Arch': {'type': 'string'},
++                                               'Number': {'$ref': '#/definitions/Number'},
++                                               'Series': {'type': 'string'}},
++                                'required': ['Number', 'Series', 'Arch'],
++                                'type': 'object'},
++                     'BundleChange': {'additionalProperties': False,
++                                      'properties': {'args': {'items': {'additionalProperties': True,
++                                                                        'type': 'object'},
++                                                              'type': 'array'},
++                                                     'id': {'type': 'string'},
++                                                     'method': {'type': 'string'},
++                                                     'requires': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                      'required': ['id',
++                                                   'method',
++                                                   'args',
++                                                   'requires'],
++                                      'type': 'object'},
++                     'BundleChangesParams': {'additionalProperties': False,
++                                             'properties': {'yaml': {'type': 'string'}},
++                                             'required': ['yaml'],
++                                             'type': 'object'},
++                     'BundleChangesResults': {'additionalProperties': False,
++                                              'properties': {'changes': {'items': {'$ref': '#/definitions/BundleChange'},
++                                                                         'type': 'array'},
++                                                             'errors': {'items': {'type': 'string'},
++                                                                        'type': 'array'}},
++                                              'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'ConfigValue': {'additionalProperties': False,
++                                     'properties': {'source': {'type': 'string'},
++                                                    'value': {'additionalProperties': True,
++                                                              'type': 'object'}},
++                                     'required': ['value', 'source'],
++                                     'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'DestroyMachines': {'additionalProperties': False,
++                                         'properties': {'force': {'type': 'boolean'},
++                                                        'machine-names': {'items': {'type': 'string'},
++                                                                          'type': 'array'}},
++                                         'required': ['machine-names', 'force'],
++                                         'type': 'object'},
++                     'DetailedStatus': {'additionalProperties': False,
++                                        'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                             'type': 'object'}},
++                                                                'type': 'object'},
++                                                       'err': {'additionalProperties': True,
++                                                               'type': 'object'},
++                                                       'info': {'type': 'string'},
++                                                       'kind': {'type': 'string'},
++                                                       'life': {'type': 'string'},
++                                                       'since': {'format': 'date-time',
++                                                                 'type': 'string'},
++                                                       'status': {'type': 'string'},
++                                                       'version': {'type': 'string'}},
++                                        'required': ['status',
++                                                     'info',
++                                                     'data',
++                                                     'since',
++                                                     'kind',
++                                                     'version',
++                                                     'life'],
++                                        'type': 'object'},
++                     'EndpointStatus': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'name': {'type': 'string'},
++                                                       'role': {'type': 'string'},
++                                                       'subordinate': {'type': 'boolean'}},
++                                        'required': ['application',
++                                                     'name',
++                                                     'role',
++                                                     'subordinate'],
++                                        'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatus': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'info': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['status', 'info', 'since'],
++                                      'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'FindToolsParams': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'major': {'type': 'integer'},
++                                                        'minor': {'type': 'integer'},
++                                                        'number': {'$ref': '#/definitions/Number'},
++                                                        'series': {'type': 'string'}},
++                                         'required': ['number',
++                                                      'major',
++                                                      'minor',
++                                                      'arch',
++                                                      'series'],
++                                         'type': 'object'},
++                     'FindToolsResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'list': {'items': {'$ref': '#/definitions/Tools'},
++                                                                 'type': 'array'}},
++                                         'required': ['list'],
++                                         'type': 'object'},
++                     'FullStatus': {'additionalProperties': False,
++                                    'properties': {'applications': {'patternProperties': {'.*': {'$ref': '#/definitions/ApplicationStatus'}},
++                                                                    'type': 'object'},
++                                                   'machines': {'patternProperties': {'.*': {'$ref': '#/definitions/MachineStatus'}},
++                                                                'type': 'object'},
++                                                   'model': {'$ref': '#/definitions/ModelStatusInfo'},
++                                                   'relations': {'items': {'$ref': '#/definitions/RelationStatus'},
++                                                                 'type': 'array'},
++                                                   'remote-applications': {'patternProperties': {'.*': {'$ref': '#/definitions/RemoteApplicationStatus'}},
++                                                                           'type': 'object'}},
++                                    'required': ['model',
++                                                 'machines',
++                                                 'applications',
++                                                 'remote-applications',
++                                                 'relations'],
++                                    'type': 'object'},
++                     'GetConstraintsResults': {'additionalProperties': False,
++                                               'properties': {'constraints': {'$ref': '#/definitions/Value'}},
++                                               'required': ['constraints'],
++                                               'type': 'object'},
++                     'HardwareCharacteristics': {'additionalProperties': False,
++                                                 'properties': {'arch': {'type': 'string'},
++                                                                'availability-zone': {'type': 'string'},
++                                                                'cpu-cores': {'type': 'integer'},
++                                                                'cpu-power': {'type': 'integer'},
++                                                                'mem': {'type': 'integer'},
++                                                                'root-disk': {'type': 'integer'},
++                                                                'tags': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                                 'type': 'object'},
++                     'History': {'additionalProperties': False,
++                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                'statuses': {'items': {'$ref': '#/definitions/DetailedStatus'},
++                                                             'type': 'array'}},
++                                 'required': ['statuses'],
++                                 'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineHardware': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'availability-zone': {'type': 'string'},
++                                                        'cores': {'type': 'integer'},
++                                                        'cpu-power': {'type': 'integer'},
++                                                        'mem': {'type': 'integer'},
++                                                        'root-disk': {'type': 'integer'},
++                                                        'tags': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                         'type': 'object'},
++                     'MachineStatus': {'additionalProperties': False,
++                                       'properties': {'agent-status': {'$ref': '#/definitions/DetailedStatus'},
++                                                      'constraints': {'type': 'string'},
++                                                      'containers': {'patternProperties': {'.*': {'$ref': '#/definitions/MachineStatus'}},
++                                                                     'type': 'object'},
++                                                      'dns-name': {'type': 'string'},
++                                                      'hardware': {'type': 'string'},
++                                                      'has-vote': {'type': 'boolean'},
++                                                      'id': {'type': 'string'},
++                                                      'instance-id': {'type': 'string'},
++                                                      'instance-status': {'$ref': '#/definitions/DetailedStatus'},
++                                                      'ip-addresses': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                      'jobs': {'items': {'type': 'string'},
++                                                               'type': 'array'},
++                                                      'network-interfaces': {'patternProperties': {'.*': {'$ref': '#/definitions/NetworkInterface'}},
++                                                                             'type': 'object'},
++                                                      'series': {'type': 'string'},
++                                                      'wants-vote': {'type': 'boolean'}},
++                                       'required': ['agent-status',
++                                                    'instance-status',
++                                                    'dns-name',
++                                                    'instance-id',
++                                                    'series',
++                                                    'id',
++                                                    'containers',
++                                                    'constraints',
++                                                    'hardware',
++                                                    'jobs',
++                                                    'has-vote',
++                                                    'wants-vote'],
++                                       'type': 'object'},
++                     'MeterStatus': {'additionalProperties': False,
++                                     'properties': {'color': {'type': 'string'},
++                                                    'message': {'type': 'string'}},
++                                     'required': ['color', 'message'],
++                                     'type': 'object'},
++                     'ModelConfigResults': {'additionalProperties': False,
++                                            'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ConfigValue'}},
++                                                                      'type': 'object'}},
++                                            'required': ['config'],
++                                            'type': 'object'},
++                     'ModelInfo': {'additionalProperties': False,
++                                   'properties': {'agent-version': {'$ref': '#/definitions/Number'},
++                                                  'cloud-credential-tag': {'type': 'string'},
++                                                  'cloud-region': {'type': 'string'},
++                                                  'cloud-tag': {'type': 'string'},
++                                                  'controller-uuid': {'type': 'string'},
++                                                  'default-series': {'type': 'string'},
++                                                  'life': {'type': 'string'},
++                                                  'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                               'type': 'array'},
++                                                  'migration': {'$ref': '#/definitions/ModelMigrationStatus'},
++                                                  'name': {'type': 'string'},
++                                                  'owner-tag': {'type': 'string'},
++                                                  'provider-type': {'type': 'string'},
++                                                  'sla': {'$ref': '#/definitions/ModelSLAInfo'},
++                                                  'status': {'$ref': '#/definitions/EntityStatus'},
++                                                  'users': {'items': {'$ref': '#/definitions/ModelUserInfo'},
++                                                            'type': 'array'},
++                                                  'uuid': {'type': 'string'}},
++                                   'required': ['name',
++                                                'uuid',
++                                                'controller-uuid',
++                                                'cloud-tag',
++                                                'owner-tag',
++                                                'life',
++                                                'users',
++                                                'machines',
++                                                'sla',
++                                                'agent-version'],
++                                   'type': 'object'},
++                     'ModelMachineInfo': {'additionalProperties': False,
++                                          'properties': {'hardware': {'$ref': '#/definitions/MachineHardware'},
++                                                         'has-vote': {'type': 'boolean'},
++                                                         'id': {'type': 'string'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'wants-vote': {'type': 'boolean'}},
++                                          'required': ['id'],
++                                          'type': 'object'},
++                     'ModelMigrationStatus': {'additionalProperties': False,
++                                              'properties': {'end': {'format': 'date-time',
++                                                                     'type': 'string'},
++                                                             'start': {'format': 'date-time',
++                                                                       'type': 'string'},
++                                                             'status': {'type': 'string'}},
++                                              'required': ['status', 'start'],
++                                              'type': 'object'},
++                     'ModelSLA': {'additionalProperties': False,
++                                  'properties': {'ModelSLAInfo': {'$ref': '#/definitions/ModelSLAInfo'},
++                                                 'creds': {'items': {'type': 'integer'},
++                                                           'type': 'array'}},
++                                  'required': ['ModelSLAInfo', 'creds'],
++                                  'type': 'object'},
++                     'ModelSLAInfo': {'additionalProperties': False,
++                                      'properties': {'level': {'type': 'string'},
++                                                     'owner': {'type': 'string'}},
++                                      'required': ['level', 'owner'],
++                                      'type': 'object'},
++                     'ModelSet': {'additionalProperties': False,
++                                  'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                         'type': 'object'}},
++                                                            'type': 'object'}},
++                                  'required': ['config'],
++                                  'type': 'object'},
++                     'ModelStatusInfo': {'additionalProperties': False,
++                                         'properties': {'available-version': {'type': 'string'},
++                                                        'cloud-tag': {'type': 'string'},
++                                                        'meter-status': {'$ref': '#/definitions/MeterStatus'},
++                                                        'model-status': {'$ref': '#/definitions/DetailedStatus'},
++                                                        'name': {'type': 'string'},
++                                                        'region': {'type': 'string'},
++                                                        'sla': {'type': 'string'},
++                                                        'version': {'type': 'string'}},
++                                         'required': ['name',
++                                                      'cloud-tag',
++                                                      'version',
++                                                      'available-version',
++                                                      'model-status',
++                                                      'meter-status',
++                                                      'sla'],
++                                         'type': 'object'},
++                     'ModelUnset': {'additionalProperties': False,
++                                    'properties': {'keys': {'items': {'type': 'string'},
++                                                            'type': 'array'}},
++                                    'required': ['keys'],
++                                    'type': 'object'},
++                     'ModelUserInfo': {'additionalProperties': False,
++                                       'properties': {'access': {'type': 'string'},
++                                                      'display-name': {'type': 'string'},
++                                                      'last-connection': {'format': 'date-time',
++                                                                          'type': 'string'},
++                                                      'user': {'type': 'string'}},
++                                       'required': ['user',
++                                                    'display-name',
++                                                    'last-connection',
++                                                    'access'],
++                                       'type': 'object'},
++                     'ModelUserInfoResult': {'additionalProperties': False,
++                                             'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                            'result': {'$ref': '#/definitions/ModelUserInfo'}},
++                                             'type': 'object'},
++                     'ModelUserInfoResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/ModelUserInfoResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'},
++                     'NetworkInterface': {'additionalProperties': False,
++                                          'properties': {'dns-nameservers': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                         'gateway': {'type': 'string'},
++                                                         'ip-addresses': {'items': {'type': 'string'},
++                                                                          'type': 'array'},
++                                                         'is-up': {'type': 'boolean'},
++                                                         'mac-address': {'type': 'string'},
++                                                         'space': {'type': 'string'}},
++                                          'required': ['ip-addresses',
++                                                       'mac-address',
++                                                       'is-up'],
++                                          'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'PrivateAddress': {'additionalProperties': False,
++                                        'properties': {'target': {'type': 'string'}},
++                                        'required': ['target'],
++                                        'type': 'object'},
++                     'PrivateAddressResults': {'additionalProperties': False,
++                                               'properties': {'private-address': {'type': 'string'}},
++                                               'required': ['private-address'],
++                                               'type': 'object'},
++                     'ProvisioningScriptParams': {'additionalProperties': False,
++                                                  'properties': {'data-dir': {'type': 'string'},
++                                                                 'disable-package-commands': {'type': 'boolean'},
++                                                                 'machine-id': {'type': 'string'},
++                                                                 'nonce': {'type': 'string'}},
++                                                  'required': ['machine-id',
++                                                               'nonce',
++                                                               'data-dir',
++                                                               'disable-package-commands'],
++                                                  'type': 'object'},
++                     'ProvisioningScriptResult': {'additionalProperties': False,
++                                                  'properties': {'script': {'type': 'string'}},
++                                                  'required': ['script'],
++                                                  'type': 'object'},
++                     'PublicAddress': {'additionalProperties': False,
++                                       'properties': {'target': {'type': 'string'}},
++                                       'required': ['target'],
++                                       'type': 'object'},
++                     'PublicAddressResults': {'additionalProperties': False,
++                                              'properties': {'public-address': {'type': 'string'}},
++                                              'required': ['public-address'],
++                                              'type': 'object'},
++                     'RelationStatus': {'additionalProperties': False,
++                                        'properties': {'endpoints': {'items': {'$ref': '#/definitions/EndpointStatus'},
++                                                                     'type': 'array'},
++                                                       'id': {'type': 'integer'},
++                                                       'interface': {'type': 'string'},
++                                                       'key': {'type': 'string'},
++                                                       'scope': {'type': 'string'}},
++                                        'required': ['id',
++                                                     'key',
++                                                     'interface',
++                                                     'scope',
++                                                     'endpoints'],
++                                        'type': 'object'},
++                     'RemoteApplicationStatus': {'additionalProperties': False,
++                                                 'properties': {'application-name': {'type': 'string'},
++                                                                'application-url': {'type': 'string'},
++                                                                'endpoints': {'items': {'$ref': '#/definitions/RemoteEndpoint'},
++                                                                              'type': 'array'},
++                                                                'err': {'additionalProperties': True,
++                                                                        'type': 'object'},
++                                                                'life': {'type': 'string'},
++                                                                'relations': {'patternProperties': {'.*': {'items': {'type': 'string'},
++                                                                                                           'type': 'array'}},
++                                                                              'type': 'object'},
++                                                                'status': {'$ref': '#/definitions/DetailedStatus'}},
++                                                 'required': ['application-url',
++                                                              'application-name',
++                                                              'endpoints',
++                                                              'life',
++                                                              'relations',
++                                                              'status'],
++                                                 'type': 'object'},
++                     'RemoteEndpoint': {'additionalProperties': False,
++                                        'properties': {'interface': {'type': 'string'},
++                                                       'limit': {'type': 'integer'},
++                                                       'name': {'type': 'string'},
++                                                       'role': {'type': 'string'},
++                                                       'scope': {'type': 'string'}},
++                                        'required': ['name',
++                                                     'role',
++                                                     'interface',
++                                                     'limit',
++                                                     'scope'],
++                                        'type': 'object'},
++                     'ResolveCharmResult': {'additionalProperties': False,
++                                            'properties': {'error': {'type': 'string'},
++                                                           'url': {'type': 'string'}},
++                                            'type': 'object'},
++                     'ResolveCharmResults': {'additionalProperties': False,
++                                             'properties': {'urls': {'items': {'$ref': '#/definitions/ResolveCharmResult'},
++                                                                     'type': 'array'}},
++                                             'required': ['urls'],
++                                             'type': 'object'},
++                     'ResolveCharms': {'additionalProperties': False,
++                                       'properties': {'references': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                       'required': ['references'],
++                                       'type': 'object'},
++                     'Resolved': {'additionalProperties': False,
++                                  'properties': {'retry': {'type': 'boolean'},
++                                                 'unit-name': {'type': 'string'}},
++                                  'required': ['unit-name', 'retry'],
++                                  'type': 'object'},
++                     'SetConstraints': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'constraints': {'$ref': '#/definitions/Value'}},
++                                        'required': ['application', 'constraints'],
++                                        'type': 'object'},
++                     'SetModelAgentVersion': {'additionalProperties': False,
++                                              'properties': {'version': {'$ref': '#/definitions/Number'}},
++                                              'required': ['version'],
++                                              'type': 'object'},
++                     'StatusHistoryFilter': {'additionalProperties': False,
++                                             'properties': {'date': {'format': 'date-time',
++                                                                     'type': 'string'},
++                                                            'delta': {'type': 'integer'},
++                                                            'exclude': {'items': {'type': 'string'},
++                                                                        'type': 'array'},
++                                                            'size': {'type': 'integer'}},
++                                             'required': ['size',
++                                                          'date',
++                                                          'delta',
++                                                          'exclude'],
++                                             'type': 'object'},
++                     'StatusHistoryRequest': {'additionalProperties': False,
++                                              'properties': {'filter': {'$ref': '#/definitions/StatusHistoryFilter'},
++                                                             'historyKind': {'type': 'string'},
++                                                             'size': {'type': 'integer'},
++                                                             'tag': {'type': 'string'}},
++                                              'required': ['historyKind',
++                                                           'size',
++                                                           'filter',
++                                                           'tag'],
++                                              'type': 'object'},
++                     'StatusHistoryRequests': {'additionalProperties': False,
++                                               'properties': {'requests': {'items': {'$ref': '#/definitions/StatusHistoryRequest'},
++                                                                           'type': 'array'}},
++                                               'required': ['requests'],
++                                               'type': 'object'},
++                     'StatusHistoryResult': {'additionalProperties': False,
++                                             'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                            'history': {'$ref': '#/definitions/History'}},
++                                             'required': ['history'],
++                                             'type': 'object'},
++                     'StatusHistoryResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/StatusHistoryResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'},
++                     'StatusParams': {'additionalProperties': False,
++                                      'properties': {'patterns': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                      'required': ['patterns'],
++                                      'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'Tools': {'additionalProperties': False,
++                               'properties': {'sha256': {'type': 'string'},
++                                              'size': {'type': 'integer'},
++                                              'url': {'type': 'string'},
++                                              'version': {'$ref': '#/definitions/Binary'}},
++                               'required': ['version', 'url', 'size'],
++                               'type': 'object'},
++                     'UnitStatus': {'additionalProperties': False,
++                                    'properties': {'agent-status': {'$ref': '#/definitions/DetailedStatus'},
++                                                   'charm': {'type': 'string'},
++                                                   'leader': {'type': 'boolean'},
++                                                   'machine': {'type': 'string'},
++                                                   'opened-ports': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                   'public-address': {'type': 'string'},
++                                                   'subordinates': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitStatus'}},
++                                                                    'type': 'object'},
++                                                   'workload-status': {'$ref': '#/definitions/DetailedStatus'},
++                                                   'workload-version': {'type': 'string'}},
++                                    'required': ['agent-status',
++                                                 'workload-status',
++                                                 'workload-version',
++                                                 'machine',
++                                                 'opened-ports',
++                                                 'public-address',
++                                                 'charm',
++                                                 'subordinates'],
++                                    'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'AbortCurrentUpgrade': {'type': 'object'},
++                    'AddCharm': {'properties': {'Params': {'$ref': '#/definitions/AddCharm'}},
++                                 'type': 'object'},
++                    'AddCharmWithAuthorization': {'properties': {'Params': {'$ref': '#/definitions/AddCharmWithAuthorization'}},
++                                                  'type': 'object'},
++                    'AddMachines': {'properties': {'Params': {'$ref': '#/definitions/AddMachines'},
++                                                   'Result': {'$ref': '#/definitions/AddMachinesResults'}},
++                                    'type': 'object'},
++                    'AddMachinesV2': {'properties': {'Params': {'$ref': '#/definitions/AddMachines'},
++                                                     'Result': {'$ref': '#/definitions/AddMachinesResults'}},
++                                      'type': 'object'},
++                    'AgentVersion': {'properties': {'Result': {'$ref': '#/definitions/AgentVersionResult'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'DestroyMachines': {'properties': {'Params': {'$ref': '#/definitions/DestroyMachines'}},
++                                        'type': 'object'},
++                    'FindTools': {'properties': {'Params': {'$ref': '#/definitions/FindToolsParams'},
++                                                 'Result': {'$ref': '#/definitions/FindToolsResult'}},
++                                  'type': 'object'},
++                    'FullStatus': {'properties': {'Params': {'$ref': '#/definitions/StatusParams'},
++                                                  'Result': {'$ref': '#/definitions/FullStatus'}},
++                                   'type': 'object'},
++                    'GetBundleChanges': {'properties': {'Params': {'$ref': '#/definitions/BundleChangesParams'},
++                                                        'Result': {'$ref': '#/definitions/BundleChangesResults'}},
++                                         'type': 'object'},
++                    'GetModelConstraints': {'properties': {'Result': {'$ref': '#/definitions/GetConstraintsResults'}},
++                                            'type': 'object'},
++                    'InjectMachines': {'properties': {'Params': {'$ref': '#/definitions/AddMachines'},
++                                                      'Result': {'$ref': '#/definitions/AddMachinesResults'}},
++                                       'type': 'object'},
++                    'ModelGet': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResults'}},
++                                 'type': 'object'},
++                    'ModelInfo': {'properties': {'Result': {'$ref': '#/definitions/ModelInfo'}},
++                                  'type': 'object'},
++                    'ModelSet': {'properties': {'Params': {'$ref': '#/definitions/ModelSet'}},
++                                 'type': 'object'},
++                    'ModelUnset': {'properties': {'Params': {'$ref': '#/definitions/ModelUnset'}},
++                                   'type': 'object'},
++                    'ModelUserInfo': {'properties': {'Result': {'$ref': '#/definitions/ModelUserInfoResults'}},
++                                      'type': 'object'},
++                    'PrivateAddress': {'properties': {'Params': {'$ref': '#/definitions/PrivateAddress'},
++                                                      'Result': {'$ref': '#/definitions/PrivateAddressResults'}},
++                                       'type': 'object'},
++                    'ProvisioningScript': {'properties': {'Params': {'$ref': '#/definitions/ProvisioningScriptParams'},
++                                                          'Result': {'$ref': '#/definitions/ProvisioningScriptResult'}},
++                                           'type': 'object'},
++                    'PublicAddress': {'properties': {'Params': {'$ref': '#/definitions/PublicAddress'},
++                                                     'Result': {'$ref': '#/definitions/PublicAddressResults'}},
++                                      'type': 'object'},
++                    'ResolveCharms': {'properties': {'Params': {'$ref': '#/definitions/ResolveCharms'},
++                                                     'Result': {'$ref': '#/definitions/ResolveCharmResults'}},
++                                      'type': 'object'},
++                    'Resolved': {'properties': {'Params': {'$ref': '#/definitions/Resolved'}},
++                                 'type': 'object'},
++                    'RetryProvisioning': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SLALevel': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                 'type': 'object'},
++                    'SetModelAgentVersion': {'properties': {'Params': {'$ref': '#/definitions/SetModelAgentVersion'}},
++                                             'type': 'object'},
++                    'SetModelConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}},
++                                            'type': 'object'},
++                    'SetSLALevel': {'properties': {'Params': {'$ref': '#/definitions/ModelSLA'}},
++                                    'type': 'object'},
++                    'StatusHistory': {'properties': {'Params': {'$ref': '#/definitions/StatusHistoryRequests'},
++                                                     'Result': {'$ref': '#/definitions/StatusHistoryResults'}},
++                                      'type': 'object'},
++                    'WatchAll': {'properties': {'Result': {'$ref': '#/definitions/AllWatcherId'}},
++                                 'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='APIHostPorts', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def AbortCurrentUpgrade(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AbortCurrentUpgrade', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def AddCharm(self, channel, url):
++        '''
++        channel : str
++        url : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AddCharm', version=1, params=_params)
++        _params['channel'] = channel
++        _params['url'] = url
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def AddCharmWithAuthorization(self, channel, macaroon, url):
++        '''
++        channel : str
++        macaroon : Macaroon
++        url : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AddCharmWithAuthorization', version=1, params=_params)
++        _params['channel'] = channel
++        _params['macaroon'] = macaroon
++        _params['url'] = url
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddMachinesResults)
++    async def AddMachines(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AddMachines', version=1, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddMachinesResults)
++    async def AddMachinesV2(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AddMachinesV2', version=1, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AgentVersionResult)
++    async def AgentVersion(self):
++        '''
++
++        Returns -> Number
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='AgentVersion', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='CACert', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyMachines(self, force, machine_names):
++        '''
++        force : bool
++        machine_names : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='DestroyMachines', version=1, params=_params)
++        _params['force'] = force
++        _params['machine-names'] = machine_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FindToolsResult)
++    async def FindTools(self, arch, major, minor, number, series):
++        '''
++        arch : str
++        major : int
++        minor : int
++        number : Number
++        series : str
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[~Tools]<~Tools>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='FindTools', version=1, params=_params)
++        _params['arch'] = arch
++        _params['major'] = major
++        _params['minor'] = minor
++        _params['number'] = number
++        _params['series'] = series
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FullStatus)
++    async def FullStatus(self, patterns):
++        '''
++        patterns : typing.Sequence<+T_co>[str]
++        Returns -> typing.Union[_ForwardRef('ModelStatusInfo'), typing.Sequence<+T_co>[~RelationStatus]<~RelationStatus>, typing.Mapping<~KT, +VT_co>[str, ~RemoteApplicationStatus]<~RemoteApplicationStatus>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='FullStatus', version=1, params=_params)
++        _params['patterns'] = patterns
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BundleChangesResults)
++    async def GetBundleChanges(self, yaml):
++        '''
++        yaml : str
++        Returns -> typing.Sequence<+T_co>[~BundleChange]<~BundleChange>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='GetBundleChanges', version=1, params=_params)
++        _params['yaml'] = yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetConstraintsResults)
++    async def GetModelConstraints(self):
++        '''
++
++        Returns -> Value
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='GetModelConstraints', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddMachinesResults)
++    async def InjectMachines(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='InjectMachines', version=1, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResults)
++    async def ModelGet(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ModelGet', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelInfo)
++    async def ModelInfo(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Number'), _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ModelInfo', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ModelSet(self, config):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ModelSet', version=1, params=_params)
++        _params['config'] = config
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ModelUnset(self, keys):
++        '''
++        keys : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ModelUnset', version=1, params=_params)
++        _params['keys'] = keys
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelUserInfoResults)
++    async def ModelUserInfo(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~ModelUserInfoResult]<~ModelUserInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ModelUserInfo', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PrivateAddressResults)
++    async def PrivateAddress(self, target):
++        '''
++        target : str
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='PrivateAddress', version=1, params=_params)
++        _params['target'] = target
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ProvisioningScriptResult)
++    async def ProvisioningScript(self, data_dir, disable_package_commands, machine_id, nonce):
++        '''
++        data_dir : str
++        disable_package_commands : bool
++        machine_id : str
++        nonce : str
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ProvisioningScript', version=1, params=_params)
++        _params['data-dir'] = data_dir
++        _params['disable-package-commands'] = disable_package_commands
++        _params['machine-id'] = machine_id
++        _params['nonce'] = nonce
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PublicAddressResults)
++    async def PublicAddress(self, target):
++        '''
++        target : str
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='PublicAddress', version=1, params=_params)
++        _params['target'] = target
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ResolveCharmResults)
++    async def ResolveCharms(self, references):
++        '''
++        references : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~ResolveCharmResult]<~ResolveCharmResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='ResolveCharms', version=1, params=_params)
++        _params['references'] = references
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Resolved(self, retry, unit_name):
++        '''
++        retry : bool
++        unit_name : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='Resolved', version=1, params=_params)
++        _params['retry'] = retry
++        _params['unit-name'] = unit_name
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RetryProvisioning(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='RetryProvisioning', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def SLALevel(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='SLALevel', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetModelAgentVersion(self, version):
++        '''
++        version : Number
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='SetModelAgentVersion', version=1, params=_params)
++        _params['version'] = version
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetModelConstraints(self, application, constraints):
++        '''
++        application : str
++        constraints : Value
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='SetModelConstraints', version=1, params=_params)
++        _params['application'] = application
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetSLALevel(self, creds, level):
++        '''
++        creds : typing.Sequence<+T_co>[int]
++        level : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='SetSLALevel', version=1, params=_params)
++        _params['creds'] = creds
++        _params['level'] = level
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusHistoryResults)
++    async def StatusHistory(self, requests):
++        '''
++        requests : typing.Sequence<+T_co>[~StatusHistoryRequest]<~StatusHistoryRequest>
++        Returns -> typing.Sequence<+T_co>[~StatusHistoryResult]<~StatusHistoryResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='StatusHistory', version=1, params=_params)
++        _params['requests'] = requests
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AllWatcherId)
++    async def WatchAll(self):
++        '''
++
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Client', request='WatchAll', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class CloudFacade(Type):
++    name = 'Cloud'
++    version = 1
++    schema =     {'definitions': {'Cloud': {'additionalProperties': False,
++                               'properties': {'auth-types': {'items': {'type': 'string'},
++                                                             'type': 'array'},
++                                              'endpoint': {'type': 'string'},
++                                              'identity-endpoint': {'type': 'string'},
++                                              'regions': {'items': {'$ref': '#/definitions/CloudRegion'},
++                                                          'type': 'array'},
++                                              'storage-endpoint': {'type': 'string'},
++                                              'type': {'type': 'string'}},
++                               'required': ['type'],
++                               'type': 'object'},
++                     'CloudCredential': {'additionalProperties': False,
++                                         'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                        'auth-type': {'type': 'string'},
++                                                        'redacted': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                         'required': ['auth-type'],
++                                         'type': 'object'},
++                     'CloudCredentialResult': {'additionalProperties': False,
++                                               'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                              'result': {'$ref': '#/definitions/CloudCredential'}},
++                                               'type': 'object'},
++                     'CloudCredentialResults': {'additionalProperties': False,
++                                                'properties': {'results': {'items': {'$ref': '#/definitions/CloudCredentialResult'},
++                                                                           'type': 'array'}},
++                                                'type': 'object'},
++                     'CloudInstanceTypesConstraint': {'additionalProperties': False,
++                                                      'properties': {'cloud-tag': {'type': 'string'},
++                                                                     'constraints': {'$ref': '#/definitions/Value'},
++                                                                     'region': {'type': 'string'}},
++                                                      'required': ['cloud-tag',
++                                                                   'region'],
++                                                      'type': 'object'},
++                     'CloudInstanceTypesConstraints': {'additionalProperties': False,
++                                                       'properties': {'constraints': {'items': {'$ref': '#/definitions/CloudInstanceTypesConstraint'},
++                                                                                      'type': 'array'}},
++                                                       'required': ['constraints'],
++                                                       'type': 'object'},
++                     'CloudRegion': {'additionalProperties': False,
++                                     'properties': {'endpoint': {'type': 'string'},
++                                                    'identity-endpoint': {'type': 'string'},
++                                                    'name': {'type': 'string'},
++                                                    'storage-endpoint': {'type': 'string'}},
++                                     'required': ['name'],
++                                     'type': 'object'},
++                     'CloudResult': {'additionalProperties': False,
++                                     'properties': {'cloud': {'$ref': '#/definitions/Cloud'},
++                                                    'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'CloudResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/CloudResult'},
++                                                                 'type': 'array'}},
++                                      'type': 'object'},
++                     'CloudsResult': {'additionalProperties': False,
++                                      'properties': {'clouds': {'patternProperties': {'.*': {'$ref': '#/definitions/Cloud'}},
++                                                                'type': 'object'}},
++                                      'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'InstanceType': {'additionalProperties': False,
++                                      'properties': {'arches': {'items': {'type': 'string'},
++                                                                'type': 'array'},
++                                                     'cost': {'type': 'integer'},
++                                                     'cpu-cores': {'type': 'integer'},
++                                                     'deprecated': {'type': 'boolean'},
++                                                     'memory': {'type': 'integer'},
++                                                     'name': {'type': 'string'},
++                                                     'root-disk': {'type': 'integer'},
++                                                     'virt-type': {'type': 'string'}},
++                                      'required': ['arches', 'cpu-cores', 'memory'],
++                                      'type': 'object'},
++                     'InstanceTypesResult': {'additionalProperties': False,
++                                             'properties': {'cost-currency': {'type': 'string'},
++                                                            'cost-divisor': {'type': 'integer'},
++                                                            'cost-unit': {'type': 'string'},
++                                                            'error': {'$ref': '#/definitions/Error'},
++                                                            'instance-types': {'items': {'$ref': '#/definitions/InstanceType'},
++                                                                               'type': 'array'}},
++                                             'type': 'object'},
++                     'InstanceTypesResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/InstanceTypesResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'UpdateCloudCredential': {'additionalProperties': False,
++                                               'properties': {'credential': {'$ref': '#/definitions/CloudCredential'},
++                                                              'tag': {'type': 'string'}},
++                                               'required': ['tag', 'credential'],
++                                               'type': 'object'},
++                     'UpdateCloudCredentials': {'additionalProperties': False,
++                                                'properties': {'credentials': {'items': {'$ref': '#/definitions/UpdateCloudCredential'},
++                                                                               'type': 'array'}},
++                                                'type': 'object'},
++                     'UserCloud': {'additionalProperties': False,
++                                   'properties': {'cloud-tag': {'type': 'string'},
++                                                  'user-tag': {'type': 'string'}},
++                                   'required': ['user-tag', 'cloud-tag'],
++                                   'type': 'object'},
++                     'UserClouds': {'additionalProperties': False,
++                                    'properties': {'user-clouds': {'items': {'$ref': '#/definitions/UserCloud'},
++                                                                   'type': 'array'}},
++                                    'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'Cloud': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/CloudResults'}},
++                              'type': 'object'},
++                    'Clouds': {'properties': {'Result': {'$ref': '#/definitions/CloudsResult'}},
++                               'type': 'object'},
++                    'Credential': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/CloudCredentialResults'}},
++                                   'type': 'object'},
++                    'DefaultCloud': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                     'type': 'object'},
++                    'InstanceTypes': {'properties': {'Params': {'$ref': '#/definitions/CloudInstanceTypesConstraints'},
++                                                     'Result': {'$ref': '#/definitions/InstanceTypesResults'}},
++                                      'type': 'object'},
++                    'RevokeCredentials': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'UpdateCredentials': {'properties': {'Params': {'$ref': '#/definitions/UpdateCloudCredentials'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'UserCredentials': {'properties': {'Params': {'$ref': '#/definitions/UserClouds'},
++                                                       'Result': {'$ref': '#/definitions/StringsResults'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(CloudResults)
++    async def Cloud(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~CloudResult]<~CloudResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='Cloud', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudsResult)
++    async def Clouds(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~Cloud]<~Cloud>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='Clouds', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudCredentialResults)
++    async def Credential(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~CloudCredentialResult]<~CloudCredentialResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='Credential', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def DefaultCloud(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='DefaultCloud', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(InstanceTypesResults)
++    async def InstanceTypes(self, constraints):
++        '''
++        constraints : typing.Sequence<+T_co>[~CloudInstanceTypesConstraint]<~CloudInstanceTypesConstraint>
++        Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='InstanceTypes', version=1, params=_params)
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RevokeCredentials(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='RevokeCredentials', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateCredentials(self, credentials):
++        '''
++        credentials : typing.Sequence<+T_co>[~UpdateCloudCredential]<~UpdateCloudCredential>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='UpdateCredentials', version=1, params=_params)
++        _params['credentials'] = credentials
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResults)
++    async def UserCredentials(self, user_clouds):
++        '''
++        user_clouds : typing.Sequence<+T_co>[~UserCloud]<~UserCloud>
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cloud', request='UserCredentials', version=1, params=_params)
++        _params['user-clouds'] = user_clouds
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class DeployerFacade(Type):
++    name = 'Deployer'
++    version = 1
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'DeployerConnectionValues': {'additionalProperties': False,
++                                                  'properties': {'api-addresses': {'items': {'type': 'string'},
++                                                                                   'type': 'array'},
++                                                                 'state-addresses': {'items': {'type': 'string'},
++                                                                                     'type': 'array'}},
++                                                  'required': ['state-addresses',
++                                                               'api-addresses'],
++                                                  'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityPassword': {'additionalProperties': False,
++                                        'properties': {'password': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'password'],
++                                        'type': 'object'},
++                     'EntityPasswords': {'additionalProperties': False,
++                                         'properties': {'changes': {'items': {'$ref': '#/definitions/EntityPassword'},
++                                                                    'type': 'array'}},
++                                         'required': ['changes'],
++                                         'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'}},
++     'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                     'type': 'object'},
++                    'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'ConnectionInfo': {'properties': {'Result': {'$ref': '#/definitions/DeployerConnectionValues'}},
++                                       'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                  'type': 'object'},
++                    'Remove': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'SetPasswords': {'properties': {'Params': {'$ref': '#/definitions/EntityPasswords'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'StateAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                       'type': 'object'},
++                    'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                          'type': 'object'},
++                    'WatchUnits': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResult)
++    async def APIAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='APIAddresses', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='APIHostPorts', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='CACert', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DeployerConnectionValues)
++    async def ConnectionInfo(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='ConnectionInfo', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='Life', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ModelUUID(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='ModelUUID', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Remove(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='Remove', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetPasswords(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='SetPasswords', version=1, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='SetStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResult)
++    async def StateAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='StateAddresses', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='UpdateStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchAPIHostPorts(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='WatchAPIHostPorts', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchUnits(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Deployer', request='WatchUnits', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class HostKeyReporterFacade(Type):
++    name = 'HostKeyReporter'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SSHHostKeySet': {'additionalProperties': False,
++                                       'properties': {'entity-keys': {'items': {'$ref': '#/definitions/SSHHostKeys'},
++                                                                      'type': 'array'}},
++                                       'required': ['entity-keys'],
++                                       'type': 'object'},
++                     'SSHHostKeys': {'additionalProperties': False,
++                                     'properties': {'public-keys': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                    'tag': {'type': 'string'}},
++                                     'required': ['tag', 'public-keys'],
++                                     'type': 'object'}},
++     'properties': {'ReportKeys': {'properties': {'Params': {'$ref': '#/definitions/SSHHostKeySet'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def ReportKeys(self, entity_keys):
++        '''
++        entity_keys : typing.Sequence<+T_co>[~SSHHostKeys]<~SSHHostKeys>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='HostKeyReporter', request='ReportKeys', version=1, params=_params)
++        _params['entity-keys'] = entity_keys
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class KeyManagerFacade(Type):
++    name = 'KeyManager'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ListSSHKeys': {'additionalProperties': False,
++                                     'properties': {'entities': {'$ref': '#/definitions/Entities'},
++                                                    'mode': {'type': 'boolean'}},
++                                     'required': ['entities', 'mode'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModifyUserSSHKeys': {'additionalProperties': False,
++                                           'properties': {'ssh-keys': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                          'user': {'type': 'string'}},
++                                           'required': ['user', 'ssh-keys'],
++                                           'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'}},
++     'properties': {'AddKeys': {'properties': {'Params': {'$ref': '#/definitions/ModifyUserSSHKeys'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'DeleteKeys': {'properties': {'Params': {'$ref': '#/definitions/ModifyUserSSHKeys'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'ImportKeys': {'properties': {'Params': {'$ref': '#/definitions/ModifyUserSSHKeys'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'ListKeys': {'properties': {'Params': {'$ref': '#/definitions/ListSSHKeys'},
++                                                'Result': {'$ref': '#/definitions/StringsResults'}},
++                                 'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AddKeys(self, ssh_keys, user):
++        '''
++        ssh_keys : typing.Sequence<+T_co>[str]
++        user : str
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyManager', request='AddKeys', version=1, params=_params)
++        _params['ssh-keys'] = ssh_keys
++        _params['user'] = user
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DeleteKeys(self, ssh_keys, user):
++        '''
++        ssh_keys : typing.Sequence<+T_co>[str]
++        user : str
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyManager', request='DeleteKeys', version=1, params=_params)
++        _params['ssh-keys'] = ssh_keys
++        _params['user'] = user
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ImportKeys(self, ssh_keys, user):
++        '''
++        ssh_keys : typing.Sequence<+T_co>[str]
++        user : str
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyManager', request='ImportKeys', version=1, params=_params)
++        _params['ssh-keys'] = ssh_keys
++        _params['user'] = user
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResults)
++    async def ListKeys(self, entities, mode):
++        '''
++        entities : Entities
++        mode : bool
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyManager', request='ListKeys', version=1, params=_params)
++        _params['entities'] = entities
++        _params['mode'] = mode
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class KeyUpdaterFacade(Type):
++    name = 'KeyUpdater'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'}},
++     'properties': {'AuthorisedKeys': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StringsResults'}},
++                                       'type': 'object'},
++                    'WatchAuthorisedKeys': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                           'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                            'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResults)
++    async def AuthorisedKeys(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyUpdater', request='AuthorisedKeys', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchAuthorisedKeys(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='KeyUpdater', request='WatchAuthorisedKeys', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class LifeFlagFacade(Type):
++    name = 'LifeFlag'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'}},
++     'properties': {'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LifeFlag', request='Life', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LifeFlag', request='Watch', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class LogForwardingFacade(Type):
++    name = 'LogForwarding'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'LogForwardingGetLastSentParams': {'additionalProperties': False,
++                                                        'properties': {'ids': {'items': {'$ref': '#/definitions/LogForwardingID'},
++                                                                               'type': 'array'}},
++                                                        'required': ['ids'],
++                                                        'type': 'object'},
++                     'LogForwardingGetLastSentResult': {'additionalProperties': False,
++                                                        'properties': {'err': {'$ref': '#/definitions/Error'},
++                                                                       'record-id': {'type': 'integer'},
++                                                                       'record-timestamp': {'type': 'integer'}},
++                                                        'required': ['record-id',
++                                                                     'record-timestamp',
++                                                                     'err'],
++                                                        'type': 'object'},
++                     'LogForwardingGetLastSentResults': {'additionalProperties': False,
++                                                         'properties': {'results': {'items': {'$ref': '#/definitions/LogForwardingGetLastSentResult'},
++                                                                                    'type': 'array'}},
++                                                         'required': ['results'],
++                                                         'type': 'object'},
++                     'LogForwardingID': {'additionalProperties': False,
++                                         'properties': {'model': {'type': 'string'},
++                                                        'sink': {'type': 'string'}},
++                                         'required': ['model', 'sink'],
++                                         'type': 'object'},
++                     'LogForwardingSetLastSentParam': {'additionalProperties': False,
++                                                       'properties': {'LogForwardingID': {'$ref': '#/definitions/LogForwardingID'},
++                                                                      'record-id': {'type': 'integer'},
++                                                                      'record-timestamp': {'type': 'integer'}},
++                                                       'required': ['LogForwardingID',
++                                                                    'record-id',
++                                                                    'record-timestamp'],
++                                                       'type': 'object'},
++                     'LogForwardingSetLastSentParams': {'additionalProperties': False,
++                                                        'properties': {'params': {'items': {'$ref': '#/definitions/LogForwardingSetLastSentParam'},
++                                                                                  'type': 'array'}},
++                                                        'required': ['params'],
++                                                        'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'GetLastSent': {'properties': {'Params': {'$ref': '#/definitions/LogForwardingGetLastSentParams'},
++                                                   'Result': {'$ref': '#/definitions/LogForwardingGetLastSentResults'}},
++                                    'type': 'object'},
++                    'SetLastSent': {'properties': {'Params': {'$ref': '#/definitions/LogForwardingSetLastSentParams'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(LogForwardingGetLastSentResults)
++    async def GetLastSent(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~LogForwardingID]<~LogForwardingID>
++        Returns -> typing.Sequence<+T_co>[~LogForwardingGetLastSentResult]<~LogForwardingGetLastSentResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LogForwarding', request='GetLastSent', version=1, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetLastSent(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~LogForwardingSetLastSentParam]<~LogForwardingSetLastSentParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LogForwarding', request='SetLastSent', version=1, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class LoggerFacade(Type):
++    name = 'Logger'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'}},
++     'properties': {'LoggingConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/StringResults'}},
++                                      'type': 'object'},
++                    'WatchLoggingConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringResults)
++    async def LoggingConfig(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Logger', request='LoggingConfig', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchLoggingConfig(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Logger', request='WatchLoggingConfig', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MachineActionsFacade(Type):
++    name = 'MachineActions'
++    version = 1
++    schema =     {'definitions': {'Action': {'additionalProperties': False,
++                                'properties': {'name': {'type': 'string'},
++                                               'parameters': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                               'receiver': {'type': 'string'},
++                                               'tag': {'type': 'string'}},
++                                'required': ['tag', 'receiver', 'name'],
++                                'type': 'object'},
++                     'ActionExecutionResult': {'additionalProperties': False,
++                                               'properties': {'action-tag': {'type': 'string'},
++                                                              'message': {'type': 'string'},
++                                                              'results': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'},
++                                                              'status': {'type': 'string'}},
++                                               'required': ['action-tag', 'status'],
++                                               'type': 'object'},
++                     'ActionExecutionResults': {'additionalProperties': False,
++                                                'properties': {'results': {'items': {'$ref': '#/definitions/ActionExecutionResult'},
++                                                                           'type': 'array'}},
++                                                'type': 'object'},
++                     'ActionResult': {'additionalProperties': False,
++                                      'properties': {'action': {'$ref': '#/definitions/Action'},
++                                                     'completed': {'format': 'date-time',
++                                                                   'type': 'string'},
++                                                     'enqueued': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'message': {'type': 'string'},
++                                                     'output': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                             'type': 'object'}},
++                                                                'type': 'object'},
++                                                     'started': {'format': 'date-time',
++                                                                 'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'type': 'object'},
++                     'ActionResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'ActionsByReceiver': {'additionalProperties': False,
++                                           'properties': {'actions': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                      'type': 'array'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'receiver': {'type': 'string'}},
++                                           'type': 'object'},
++                     'ActionsByReceivers': {'additionalProperties': False,
++                                            'properties': {'actions': {'items': {'$ref': '#/definitions/ActionsByReceiver'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'}},
++     'properties': {'Actions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ActionResults'}},
++                                'type': 'object'},
++                    'BeginActions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'FinishActions': {'properties': {'Params': {'$ref': '#/definitions/ActionExecutionResults'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'RunningActions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/ActionsByReceivers'}},
++                                       'type': 'object'},
++                    'WatchActionNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                 'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ActionResults)
++    async def Actions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineActions', request='Actions', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def BeginActions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineActions', request='BeginActions', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def FinishActions(self, results):
++        '''
++        results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineActions', request='FinishActions', version=1, params=_params)
++        _params['results'] = results
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByReceivers)
++    async def RunningActions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineActions', request='RunningActions', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchActionNotifications(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineActions', request='WatchActionNotifications', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MachineUndertakerFacade(Type):
++    name = 'MachineUndertaker'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'EntitiesResult': {'additionalProperties': False,
++                                        'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                                    'type': 'array'},
++                                                       'error': {'$ref': '#/definitions/Error'}},
++                                        'required': ['entities'],
++                                        'type': 'object'},
++                     'EntitiesResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/EntitiesResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'ProviderInterfaceInfo': {'additionalProperties': False,
++                                               'properties': {'interface-name': {'type': 'string'},
++                                                              'mac-address': {'type': 'string'},
++                                                              'provider-id': {'type': 'string'}},
++                                               'required': ['interface-name',
++                                                            'mac-address',
++                                                            'provider-id'],
++                                               'type': 'object'},
++                     'ProviderInterfaceInfoResult': {'additionalProperties': False,
++                                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                    'interfaces': {'items': {'$ref': '#/definitions/ProviderInterfaceInfo'},
++                                                                                   'type': 'array'},
++                                                                    'machine-tag': {'type': 'string'}},
++                                                     'required': ['machine-tag',
++                                                                  'interfaces'],
++                                                     'type': 'object'},
++                     'ProviderInterfaceInfoResults': {'additionalProperties': False,
++                                                      'properties': {'results': {'items': {'$ref': '#/definitions/ProviderInterfaceInfoResult'},
++                                                                                 'type': 'array'}},
++                                                      'required': ['results'],
++                                                      'type': 'object'}},
++     'properties': {'AllMachineRemovals': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/EntitiesResults'}},
++                                           'type': 'object'},
++                    'CompleteMachineRemovals': {'properties': {'Params': {'$ref': '#/definitions/Entities'}},
++                                                'type': 'object'},
++                    'GetMachineProviderInterfaceInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                       'Result': {'$ref': '#/definitions/ProviderInterfaceInfoResults'}},
++                                                        'type': 'object'},
++                    'WatchMachineRemovals': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                            'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                             'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(EntitiesResults)
++    async def AllMachineRemovals(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~EntitiesResult]<~EntitiesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineUndertaker', request='AllMachineRemovals', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def CompleteMachineRemovals(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineUndertaker', request='CompleteMachineRemovals', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ProviderInterfaceInfoResults)
++    async def GetMachineProviderInterfaceInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ProviderInterfaceInfoResult]<~ProviderInterfaceInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineUndertaker', request='GetMachineProviderInterfaceInfo', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchMachineRemovals(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineUndertaker', request='WatchMachineRemovals', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MachinerFacade(Type):
++    name = 'Machiner'
++    version = 1
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'JobsResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'jobs': {'items': {'type': 'string'},
++                                                            'type': 'array'}},
++                                    'required': ['jobs'],
++                                    'type': 'object'},
++                     'JobsResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/JobsResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineAddresses': {'additionalProperties': False,
++                                          'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                       'type': 'array'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'addresses'],
++                                          'type': 'object'},
++                     'NetworkConfig': {'additionalProperties': False,
++                                       'properties': {'address': {'type': 'string'},
++                                                      'cidr': {'type': 'string'},
++                                                      'config-type': {'type': 'string'},
++                                                      'device-index': {'type': 'integer'},
++                                                      'disabled': {'type': 'boolean'},
++                                                      'dns-search-domains': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                      'dns-servers': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                      'gateway-address': {'type': 'string'},
++                                                      'interface-name': {'type': 'string'},
++                                                      'interface-type': {'type': 'string'},
++                                                      'mac-address': {'type': 'string'},
++                                                      'mtu': {'type': 'integer'},
++                                                      'no-auto-start': {'type': 'boolean'},
++                                                      'parent-interface-name': {'type': 'string'},
++                                                      'provider-address-id': {'type': 'string'},
++                                                      'provider-id': {'type': 'string'},
++                                                      'provider-space-id': {'type': 'string'},
++                                                      'provider-subnet-id': {'type': 'string'},
++                                                      'provider-vlan-id': {'type': 'string'},
++                                                      'routes': {'items': {'$ref': '#/definitions/NetworkRoute'},
++                                                                 'type': 'array'},
++                                                      'vlan-tag': {'type': 'integer'}},
++                                       'required': ['device-index',
++                                                    'mac-address',
++                                                    'cidr',
++                                                    'mtu',
++                                                    'provider-id',
++                                                    'provider-subnet-id',
++                                                    'provider-space-id',
++                                                    'provider-address-id',
++                                                    'provider-vlan-id',
++                                                    'vlan-tag',
++                                                    'interface-name',
++                                                    'parent-interface-name',
++                                                    'interface-type',
++                                                    'disabled'],
++                                       'type': 'object'},
++                     'NetworkRoute': {'additionalProperties': False,
++                                      'properties': {'destination-cidr': {'type': 'string'},
++                                                     'gateway-ip': {'type': 'string'},
++                                                     'metric': {'type': 'integer'}},
++                                      'required': ['destination-cidr',
++                                                   'gateway-ip',
++                                                   'metric'],
++                                      'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'SetMachineNetworkConfig': {'additionalProperties': False,
++                                                 'properties': {'config': {'items': {'$ref': '#/definitions/NetworkConfig'},
++                                                                           'type': 'array'},
++                                                                'tag': {'type': 'string'}},
++                                                 'required': ['tag', 'config'],
++                                                 'type': 'object'},
++                     'SetMachinesAddresses': {'additionalProperties': False,
++                                              'properties': {'machine-addresses': {'items': {'$ref': '#/definitions/MachineAddresses'},
++                                                                                   'type': 'array'}},
++                                              'required': ['machine-addresses'],
++                                              'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'}},
++     'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                     'type': 'object'},
++                    'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'Jobs': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/JobsResults'}},
++                             'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                  'type': 'object'},
++                    'SetMachineAddresses': {'properties': {'Params': {'$ref': '#/definitions/SetMachinesAddresses'},
++                                                           'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                            'type': 'object'},
++                    'SetObservedNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/SetMachineNetworkConfig'}},
++                                                 'type': 'object'},
++                    'SetProviderNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                 'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'},
++                    'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                          'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResult)
++    async def APIAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='APIAddresses', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='APIHostPorts', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='CACert', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnsureDead(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='EnsureDead', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(JobsResults)
++    async def Jobs(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~JobsResult]<~JobsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='Jobs', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='Life', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ModelUUID(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='ModelUUID', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMachineAddresses(self, machine_addresses):
++        '''
++        machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='SetMachineAddresses', version=1, params=_params)
++        _params['machine-addresses'] = machine_addresses
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetObservedNetworkConfig(self, config, tag):
++        '''
++        config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        tag : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='SetObservedNetworkConfig', version=1, params=_params)
++        _params['config'] = config
++        _params['tag'] = tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetProviderNetworkConfig(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='SetProviderNetworkConfig', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='SetStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='UpdateStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='Watch', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchAPIHostPorts(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Machiner', request='WatchAPIHostPorts', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MeterStatusFacade(Type):
++    name = 'MeterStatus'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MeterStatusResult': {'additionalProperties': False,
++                                           'properties': {'code': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'info': {'type': 'string'}},
++                                           'required': ['code', 'info'],
++                                           'type': 'object'},
++                     'MeterStatusResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/MeterStatusResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'}},
++     'properties': {'GetMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/MeterStatusResults'}},
++                                       'type': 'object'},
++                    'WatchMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                         'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(MeterStatusResults)
++    async def GetMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MeterStatus', request='GetMeterStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MeterStatus', request='WatchMeterStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MetricsManagerFacade(Type):
++    name = 'MetricsManager'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'AddJujuMachineMetrics': {'type': 'object'},
++                    'CleanupOldMetrics': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SendMetrics': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def AddJujuMachineMetrics(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsManager', request='AddJujuMachineMetrics', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def CleanupOldMetrics(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsManager', request='CleanupOldMetrics', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SendMetrics(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsManager', request='SendMetrics', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MigrationFlagFacade(Type):
++    name = 'MigrationFlag'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'PhaseResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                    'phase': {'type': 'string'}},
++                                     'type': 'object'},
++                     'PhaseResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/PhaseResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'}},
++     'properties': {'Phase': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/PhaseResults'}},
++                              'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(PhaseResults)
++    async def Phase(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~PhaseResult]<~PhaseResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationFlag', request='Phase', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationFlag', request='Watch', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MigrationMasterFacade(Type):
++    name = 'MigrationMaster'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MasterMigrationStatus': {'additionalProperties': False,
++                                               'properties': {'migration-id': {'type': 'string'},
++                                                              'phase': {'type': 'string'},
++                                                              'phase-changed-time': {'format': 'date-time',
++                                                                                     'type': 'string'},
++                                                              'spec': {'$ref': '#/definitions/MigrationSpec'}},
++                                               'required': ['spec',
++                                                            'migration-id',
++                                                            'phase',
++                                                            'phase-changed-time'],
++                                               'type': 'object'},
++                     'MigrationModelInfo': {'additionalProperties': False,
++                                            'properties': {'agent-version': {'$ref': '#/definitions/Number'},
++                                                           'controller-agent-version': {'$ref': '#/definitions/Number'},
++                                                           'name': {'type': 'string'},
++                                                           'owner-tag': {'type': 'string'},
++                                                           'uuid': {'type': 'string'}},
++                                            'required': ['uuid',
++                                                         'name',
++                                                         'owner-tag',
++                                                         'agent-version',
++                                                         'controller-agent-version'],
++                                            'type': 'object'},
++                     'MigrationSpec': {'additionalProperties': False,
++                                       'properties': {'model-tag': {'type': 'string'},
++                                                      'target-info': {'$ref': '#/definitions/MigrationTargetInfo'}},
++                                       'required': ['model-tag', 'target-info'],
++                                       'type': 'object'},
++                     'MigrationTargetInfo': {'additionalProperties': False,
++                                             'properties': {'addrs': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                            'auth-tag': {'type': 'string'},
++                                                            'ca-cert': {'type': 'string'},
++                                                            'controller-tag': {'type': 'string'},
++                                                            'macaroons': {'type': 'string'},
++                                                            'password': {'type': 'string'}},
++                                             'required': ['controller-tag',
++                                                          'addrs',
++                                                          'ca-cert',
++                                                          'auth-tag'],
++                                             'type': 'object'},
++                     'MinionReports': {'additionalProperties': False,
++                                       'properties': {'failed': {'items': {'type': 'string'},
++                                                                 'type': 'array'},
++                                                      'migration-id': {'type': 'string'},
++                                                      'phase': {'type': 'string'},
++                                                      'success-count': {'type': 'integer'},
++                                                      'unknown-count': {'type': 'integer'},
++                                                      'unknown-sample': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                       'required': ['migration-id',
++                                                    'phase',
++                                                    'success-count',
++                                                    'unknown-count',
++                                                    'unknown-sample',
++                                                    'failed'],
++                                       'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'SerializedModel': {'additionalProperties': False,
++                                         'properties': {'bytes': {'items': {'type': 'integer'},
++                                                                  'type': 'array'},
++                                                        'charms': {'items': {'type': 'string'},
++                                                                   'type': 'array'},
++                                                        'resources': {'items': {'$ref': '#/definitions/SerializedModelResource'},
++                                                                      'type': 'array'},
++                                                        'tools': {'items': {'$ref': '#/definitions/SerializedModelTools'},
++                                                                  'type': 'array'}},
++                                         'required': ['bytes',
++                                                      'charms',
++                                                      'tools',
++                                                      'resources'],
++                                         'type': 'object'},
++                     'SerializedModelResource': {'additionalProperties': False,
++                                                 'properties': {'application': {'type': 'string'},
++                                                                'application-revision': {'$ref': '#/definitions/SerializedModelResourceRevision'},
++                                                                'charmstore-revision': {'$ref': '#/definitions/SerializedModelResourceRevision'},
++                                                                'name': {'type': 'string'},
++                                                                'unit-revisions': {'patternProperties': {'.*': {'$ref': '#/definitions/SerializedModelResourceRevision'}},
++                                                                                   'type': 'object'}},
++                                                 'required': ['application',
++                                                              'name',
++                                                              'application-revision',
++                                                              'charmstore-revision',
++                                                              'unit-revisions'],
++                                                 'type': 'object'},
++                     'SerializedModelResourceRevision': {'additionalProperties': False,
++                                                         'properties': {'description': {'type': 'string'},
++                                                                        'fingerprint': {'type': 'string'},
++                                                                        'origin': {'type': 'string'},
++                                                                        'path': {'type': 'string'},
++                                                                        'revision': {'type': 'integer'},
++                                                                        'size': {'type': 'integer'},
++                                                                        'timestamp': {'format': 'date-time',
++                                                                                      'type': 'string'},
++                                                                        'type': {'type': 'string'},
++                                                                        'username': {'type': 'string'}},
++                                                         'required': ['revision',
++                                                                      'type',
++                                                                      'path',
++                                                                      'description',
++                                                                      'origin',
++                                                                      'fingerprint',
++                                                                      'size',
++                                                                      'timestamp'],
++                                                         'type': 'object'},
++                     'SerializedModelTools': {'additionalProperties': False,
++                                              'properties': {'uri': {'type': 'string'},
++                                                             'version': {'type': 'string'}},
++                                              'required': ['version', 'uri'],
++                                              'type': 'object'},
++                     'SetMigrationPhaseArgs': {'additionalProperties': False,
++                                               'properties': {'phase': {'type': 'string'}},
++                                               'required': ['phase'],
++                                               'type': 'object'},
++                     'SetMigrationStatusMessageArgs': {'additionalProperties': False,
++                                                       'properties': {'message': {'type': 'string'}},
++                                                       'required': ['message'],
++                                                       'type': 'object'}},
++     'properties': {'Export': {'properties': {'Result': {'$ref': '#/definitions/SerializedModel'}},
++                               'type': 'object'},
++                    'MigrationStatus': {'properties': {'Result': {'$ref': '#/definitions/MasterMigrationStatus'}},
++                                        'type': 'object'},
++                    'MinionReports': {'properties': {'Result': {'$ref': '#/definitions/MinionReports'}},
++                                      'type': 'object'},
++                    'ModelInfo': {'properties': {'Result': {'$ref': '#/definitions/MigrationModelInfo'}},
++                                  'type': 'object'},
++                    'Prechecks': {'type': 'object'},
++                    'Reap': {'type': 'object'},
++                    'SetPhase': {'properties': {'Params': {'$ref': '#/definitions/SetMigrationPhaseArgs'}},
++                                 'type': 'object'},
++                    'SetStatusMessage': {'properties': {'Params': {'$ref': '#/definitions/SetMigrationStatusMessageArgs'}},
++                                         'type': 'object'},
++                    'Watch': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                              'type': 'object'},
++                    'WatchMinionReports': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(SerializedModel)
++    async def Export(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='Export', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MasterMigrationStatus)
++    async def MigrationStatus(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('MigrationSpec')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='MigrationStatus', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MinionReports)
++    async def MinionReports(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='MinionReports', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MigrationModelInfo)
++    async def ModelInfo(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Number'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='ModelInfo', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Prechecks(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='Prechecks', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Reap(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='Reap', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetPhase(self, phase):
++        '''
++        phase : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='SetPhase', version=1, params=_params)
++        _params['phase'] = phase
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetStatusMessage(self, message):
++        '''
++        message : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='SetStatusMessage', version=1, params=_params)
++        _params['message'] = message
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def Watch(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='Watch', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchMinionReports(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMaster', request='WatchMinionReports', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MigrationMinionFacade(Type):
++    name = 'MigrationMinion'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MinionReport': {'additionalProperties': False,
++                                      'properties': {'migration-id': {'type': 'string'},
++                                                     'phase': {'type': 'string'},
++                                                     'success': {'type': 'boolean'}},
++                                      'required': ['migration-id',
++                                                   'phase',
++                                                   'success'],
++                                      'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'}},
++     'properties': {'Report': {'properties': {'Params': {'$ref': '#/definitions/MinionReport'}},
++                               'type': 'object'},
++                    'Watch': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                              'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def Report(self, migration_id, phase, success):
++        '''
++        migration_id : str
++        phase : str
++        success : bool
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMinion', request='Report', version=1, params=_params)
++        _params['migration-id'] = migration_id
++        _params['phase'] = phase
++        _params['success'] = success
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def Watch(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationMinion', request='Watch', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MigrationStatusWatcherFacade(Type):
++    name = 'MigrationStatusWatcher'
++    version = 1
++    schema =     {'definitions': {'MigrationStatus': {'additionalProperties': False,
++                                         'properties': {'attempt': {'type': 'integer'},
++                                                        'migration-id': {'type': 'string'},
++                                                        'phase': {'type': 'string'},
++                                                        'source-api-addrs': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                        'source-ca-cert': {'type': 'string'},
++                                                        'target-api-addrs': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                        'target-ca-cert': {'type': 'string'}},
++                                         'required': ['migration-id',
++                                                      'attempt',
++                                                      'phase',
++                                                      'source-api-addrs',
++                                                      'source-ca-cert',
++                                                      'target-api-addrs',
++                                                      'target-ca-cert'],
++                                         'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/MigrationStatus'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(MigrationStatus)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[int, typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationStatusWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationStatusWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MigrationTargetFacade(Type):
++    name = 'MigrationTarget'
++    version = 1
++    schema =     {'definitions': {'AdoptResourcesArgs': {'additionalProperties': False,
++                                            'properties': {'model-tag': {'type': 'string'},
++                                                           'source-controller-version': {'$ref': '#/definitions/Number'}},
++                                            'required': ['model-tag',
++                                                         'source-controller-version'],
++                                            'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'MigrationModelInfo': {'additionalProperties': False,
++                                            'properties': {'agent-version': {'$ref': '#/definitions/Number'},
++                                                           'controller-agent-version': {'$ref': '#/definitions/Number'},
++                                                           'name': {'type': 'string'},
++                                                           'owner-tag': {'type': 'string'},
++                                                           'uuid': {'type': 'string'}},
++                                            'required': ['uuid',
++                                                         'name',
++                                                         'owner-tag',
++                                                         'agent-version',
++                                                         'controller-agent-version'],
++                                            'type': 'object'},
++                     'ModelArgs': {'additionalProperties': False,
++                                   'properties': {'model-tag': {'type': 'string'}},
++                                   'required': ['model-tag'],
++                                   'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'SerializedModel': {'additionalProperties': False,
++                                         'properties': {'bytes': {'items': {'type': 'integer'},
++                                                                  'type': 'array'},
++                                                        'charms': {'items': {'type': 'string'},
++                                                                   'type': 'array'},
++                                                        'resources': {'items': {'$ref': '#/definitions/SerializedModelResource'},
++                                                                      'type': 'array'},
++                                                        'tools': {'items': {'$ref': '#/definitions/SerializedModelTools'},
++                                                                  'type': 'array'}},
++                                         'required': ['bytes',
++                                                      'charms',
++                                                      'tools',
++                                                      'resources'],
++                                         'type': 'object'},
++                     'SerializedModelResource': {'additionalProperties': False,
++                                                 'properties': {'application': {'type': 'string'},
++                                                                'application-revision': {'$ref': '#/definitions/SerializedModelResourceRevision'},
++                                                                'charmstore-revision': {'$ref': '#/definitions/SerializedModelResourceRevision'},
++                                                                'name': {'type': 'string'},
++                                                                'unit-revisions': {'patternProperties': {'.*': {'$ref': '#/definitions/SerializedModelResourceRevision'}},
++                                                                                   'type': 'object'}},
++                                                 'required': ['application',
++                                                              'name',
++                                                              'application-revision',
++                                                              'charmstore-revision',
++                                                              'unit-revisions'],
++                                                 'type': 'object'},
++                     'SerializedModelResourceRevision': {'additionalProperties': False,
++                                                         'properties': {'description': {'type': 'string'},
++                                                                        'fingerprint': {'type': 'string'},
++                                                                        'origin': {'type': 'string'},
++                                                                        'path': {'type': 'string'},
++                                                                        'revision': {'type': 'integer'},
++                                                                        'size': {'type': 'integer'},
++                                                                        'timestamp': {'format': 'date-time',
++                                                                                      'type': 'string'},
++                                                                        'type': {'type': 'string'},
++                                                                        'username': {'type': 'string'}},
++                                                         'required': ['revision',
++                                                                      'type',
++                                                                      'path',
++                                                                      'description',
++                                                                      'origin',
++                                                                      'fingerprint',
++                                                                      'size',
++                                                                      'timestamp'],
++                                                         'type': 'object'},
++                     'SerializedModelTools': {'additionalProperties': False,
++                                              'properties': {'uri': {'type': 'string'},
++                                                             'version': {'type': 'string'}},
++                                              'required': ['version', 'uri'],
++                                              'type': 'object'}},
++     'properties': {'Abort': {'properties': {'Params': {'$ref': '#/definitions/ModelArgs'}},
++                              'type': 'object'},
++                    'Activate': {'properties': {'Params': {'$ref': '#/definitions/ModelArgs'}},
++                                 'type': 'object'},
++                    'AdoptResources': {'properties': {'Params': {'$ref': '#/definitions/AdoptResourcesArgs'}},
++                                       'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'Import': {'properties': {'Params': {'$ref': '#/definitions/SerializedModel'}},
++                               'type': 'object'},
++                    'LatestLogTime': {'properties': {'Params': {'$ref': '#/definitions/ModelArgs'},
++                                                     'Result': {'format': 'date-time',
++                                                                'type': 'string'}},
++                                      'type': 'object'},
++                    'Prechecks': {'properties': {'Params': {'$ref': '#/definitions/MigrationModelInfo'}},
++                                  'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def Abort(self, model_tag):
++        '''
++        model_tag : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='Abort', version=1, params=_params)
++        _params['model-tag'] = model_tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Activate(self, model_tag):
++        '''
++        model_tag : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='Activate', version=1, params=_params)
++        _params['model-tag'] = model_tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def AdoptResources(self, model_tag, source_controller_version):
++        '''
++        model_tag : str
++        source_controller_version : Number
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='AdoptResources', version=1, params=_params)
++        _params['model-tag'] = model_tag
++        _params['source-controller-version'] = source_controller_version
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='CACert', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Import(self, bytes_, charms, tools):
++        '''
++        bytes_ : typing.Sequence<+T_co>[int]
++        charms : typing.Sequence<+T_co>[str]
++        tools : typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='Import', version=1, params=_params)
++        _params['bytes'] = bytes_
++        _params['charms'] = charms
++        _params['tools'] = tools
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(str)
++    async def LatestLogTime(self, model_tag):
++        '''
++        model_tag : str
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='LatestLogTime', version=1, params=_params)
++        _params['model-tag'] = model_tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Prechecks(self, agent_version, name, owner_tag, uuid):
++        '''
++        agent_version : Number
++        name : str
++        owner_tag : str
++        uuid : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MigrationTarget', request='Prechecks', version=1, params=_params)
++        _params['agent-version'] = agent_version
++        _params['name'] = name
++        _params['owner-tag'] = owner_tag
++        _params['uuid'] = uuid
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ModelConfigFacade(Type):
++    name = 'ModelConfig'
++    version = 1
++    schema =     {'definitions': {'ConfigValue': {'additionalProperties': False,
++                                     'properties': {'source': {'type': 'string'},
++                                                    'value': {'additionalProperties': True,
++                                                              'type': 'object'}},
++                                     'required': ['value', 'source'],
++                                     'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelConfigResults': {'additionalProperties': False,
++                                            'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ConfigValue'}},
++                                                                      'type': 'object'}},
++                                            'required': ['config'],
++                                            'type': 'object'},
++                     'ModelSLA': {'additionalProperties': False,
++                                  'properties': {'ModelSLAInfo': {'$ref': '#/definitions/ModelSLAInfo'},
++                                                 'creds': {'items': {'type': 'integer'},
++                                                           'type': 'array'}},
++                                  'required': ['ModelSLAInfo', 'creds'],
++                                  'type': 'object'},
++                     'ModelSLAInfo': {'additionalProperties': False,
++                                      'properties': {'level': {'type': 'string'},
++                                                     'owner': {'type': 'string'}},
++                                      'required': ['level', 'owner'],
++                                      'type': 'object'},
++                     'ModelSet': {'additionalProperties': False,
++                                  'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                         'type': 'object'}},
++                                                            'type': 'object'}},
++                                  'required': ['config'],
++                                  'type': 'object'},
++                     'ModelUnset': {'additionalProperties': False,
++                                    'properties': {'keys': {'items': {'type': 'string'},
++                                                            'type': 'array'}},
++                                    'required': ['keys'],
++                                    'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'}},
++     'properties': {'ModelGet': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResults'}},
++                                 'type': 'object'},
++                    'ModelSet': {'properties': {'Params': {'$ref': '#/definitions/ModelSet'}},
++                                 'type': 'object'},
++                    'ModelUnset': {'properties': {'Params': {'$ref': '#/definitions/ModelUnset'}},
++                                   'type': 'object'},
++                    'SLALevel': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                 'type': 'object'},
++                    'SetSLALevel': {'properties': {'Params': {'$ref': '#/definitions/ModelSLA'}},
++                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ModelConfigResults)
++    async def ModelGet(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelConfig', request='ModelGet', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ModelSet(self, config):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelConfig', request='ModelSet', version=1, params=_params)
++        _params['config'] = config
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ModelUnset(self, keys):
++        '''
++        keys : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelConfig', request='ModelUnset', version=1, params=_params)
++        _params['keys'] = keys
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def SLALevel(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelConfig', request='SLALevel', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetSLALevel(self, creds, level):
++        '''
++        creds : typing.Sequence<+T_co>[int]
++        level : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelConfig', request='SetSLALevel', version=1, params=_params)
++        _params['creds'] = creds
++        _params['level'] = level
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class NotifyWatcherFacade(Type):
++    name = 'NotifyWatcher'
++    version = 1
++    schema =     {'properties': {'Next': {'type': 'object'}, 'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def Next(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='NotifyWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='NotifyWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class PayloadsFacade(Type):
++    name = 'Payloads'
++    version = 1
++    schema =     {'definitions': {'Payload': {'additionalProperties': False,
++                                 'properties': {'class': {'type': 'string'},
++                                                'id': {'type': 'string'},
++                                                'labels': {'items': {'type': 'string'},
++                                                           'type': 'array'},
++                                                'machine': {'type': 'string'},
++                                                'status': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'unit': {'type': 'string'}},
++                                 'required': ['class',
++                                              'type',
++                                              'id',
++                                              'status',
++                                              'labels',
++                                              'unit',
++                                              'machine'],
++                                 'type': 'object'},
++                     'PayloadListArgs': {'additionalProperties': False,
++                                         'properties': {'patterns': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                         'required': ['patterns'],
++                                         'type': 'object'},
++                     'PayloadListResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/Payload'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'}},
++     'properties': {'List': {'properties': {'Params': {'$ref': '#/definitions/PayloadListArgs'},
++                                            'Result': {'$ref': '#/definitions/PayloadListResults'}},
++                             'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(PayloadListResults)
++    async def List(self, patterns):
++        '''
++        patterns : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~Payload]<~Payload>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Payloads', request='List', version=1, params=_params)
++        _params['patterns'] = patterns
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class PayloadsHookContextFacade(Type):
++    name = 'PayloadsHookContext'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'LookUpPayloadArg': {'additionalProperties': False,
++                                          'properties': {'id': {'type': 'string'},
++                                                         'name': {'type': 'string'}},
++                                          'required': ['name', 'id'],
++                                          'type': 'object'},
++                     'LookUpPayloadArgs': {'additionalProperties': False,
++                                           'properties': {'args': {'items': {'$ref': '#/definitions/LookUpPayloadArg'},
++                                                                   'type': 'array'}},
++                                           'required': ['args'],
++                                           'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Payload': {'additionalProperties': False,
++                                 'properties': {'class': {'type': 'string'},
++                                                'id': {'type': 'string'},
++                                                'labels': {'items': {'type': 'string'},
++                                                           'type': 'array'},
++                                                'machine': {'type': 'string'},
++                                                'status': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'unit': {'type': 'string'}},
++                                 'required': ['class',
++                                              'type',
++                                              'id',
++                                              'status',
++                                              'labels',
++                                              'unit',
++                                              'machine'],
++                                 'type': 'object'},
++                     'PayloadResult': {'additionalProperties': False,
++                                       'properties': {'Entity': {'$ref': '#/definitions/Entity'},
++                                                      'error': {'$ref': '#/definitions/Error'},
++                                                      'not-found': {'type': 'boolean'},
++                                                      'payload': {'$ref': '#/definitions/Payload'}},
++                                       'required': ['Entity',
++                                                    'payload',
++                                                    'not-found'],
++                                       'type': 'object'},
++                     'PayloadResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/PayloadResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'SetPayloadStatusArg': {'additionalProperties': False,
++                                             'properties': {'Entity': {'$ref': '#/definitions/Entity'},
++                                                            'status': {'type': 'string'}},
++                                             'required': ['Entity', 'status'],
++                                             'type': 'object'},
++                     'SetPayloadStatusArgs': {'additionalProperties': False,
++                                              'properties': {'args': {'items': {'$ref': '#/definitions/SetPayloadStatusArg'},
++                                                                      'type': 'array'}},
++                                              'required': ['args'],
++                                              'type': 'object'},
++                     'TrackPayloadArgs': {'additionalProperties': False,
++                                          'properties': {'payloads': {'items': {'$ref': '#/definitions/Payload'},
++                                                                      'type': 'array'}},
++                                          'required': ['payloads'],
++                                          'type': 'object'}},
++     'properties': {'List': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/PayloadResults'}},
++                             'type': 'object'},
++                    'LookUp': {'properties': {'Params': {'$ref': '#/definitions/LookUpPayloadArgs'},
++                                              'Result': {'$ref': '#/definitions/PayloadResults'}},
++                               'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetPayloadStatusArgs'},
++                                                 'Result': {'$ref': '#/definitions/PayloadResults'}},
++                                  'type': 'object'},
++                    'Track': {'properties': {'Params': {'$ref': '#/definitions/TrackPayloadArgs'},
++                                             'Result': {'$ref': '#/definitions/PayloadResults'}},
++                              'type': 'object'},
++                    'Untrack': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/PayloadResults'}},
++                                'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(PayloadResults)
++    async def List(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='PayloadsHookContext', request='List', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PayloadResults)
++    async def LookUp(self, args):
++        '''
++        args : typing.Sequence<+T_co>[~LookUpPayloadArg]<~LookUpPayloadArg>
++        Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='PayloadsHookContext', request='LookUp', version=1, params=_params)
++        _params['args'] = args
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PayloadResults)
++    async def SetStatus(self, args):
++        '''
++        args : typing.Sequence<+T_co>[~SetPayloadStatusArg]<~SetPayloadStatusArg>
++        Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='PayloadsHookContext', request='SetStatus', version=1, params=_params)
++        _params['args'] = args
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PayloadResults)
++    async def Track(self, payloads):
++        '''
++        payloads : typing.Sequence<+T_co>[~Payload]<~Payload>
++        Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='PayloadsHookContext', request='Track', version=1, params=_params)
++        _params['payloads'] = payloads
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(PayloadResults)
++    async def Untrack(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='PayloadsHookContext', request='Untrack', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class PingerFacade(Type):
++    name = 'Pinger'
++    version = 1
++    schema =     {'properties': {'Ping': {'type': 'object'}, 'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def Ping(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Pinger', request='Ping', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Pinger', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ProxyUpdaterFacade(Type):
++    name = 'ProxyUpdater'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'ProxyConfig': {'additionalProperties': False,
++                                     'properties': {'ftp': {'type': 'string'},
++                                                    'http': {'type': 'string'},
++                                                    'https': {'type': 'string'},
++                                                    'no-proxy': {'type': 'string'}},
++                                     'required': ['http',
++                                                  'https',
++                                                  'ftp',
++                                                  'no-proxy'],
++                                     'type': 'object'},
++                     'ProxyConfigResult': {'additionalProperties': False,
++                                           'properties': {'apt-proxy-settings': {'$ref': '#/definitions/ProxyConfig'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'proxy-settings': {'$ref': '#/definitions/ProxyConfig'}},
++                                           'required': ['proxy-settings',
++                                                        'apt-proxy-settings'],
++                                           'type': 'object'},
++                     'ProxyConfigResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/ProxyConfigResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'}},
++     'properties': {'ProxyConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ProxyConfigResults'}},
++                                    'type': 'object'},
++                    'WatchForProxyConfigAndAPIHostPortChanges': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                                'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                                                 'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ProxyConfigResults)
++    async def ProxyConfig(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ProxyConfigResult]<~ProxyConfigResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ProxyUpdater', request='ProxyConfig', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchForProxyConfigAndAPIHostPortChanges(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ProxyUpdater', request='WatchForProxyConfigAndAPIHostPortChanges', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class RelationUnitsWatcherFacade(Type):
++    name = 'RelationUnitsWatcher'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'RelationUnitsChange': {'additionalProperties': False,
++                                             'properties': {'changed': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitSettings'}},
++                                                                        'type': 'object'},
++                                                            'departed': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                             'required': ['changed'],
++                                             'type': 'object'},
++                     'RelationUnitsWatchResult': {'additionalProperties': False,
++                                                  'properties': {'changes': {'$ref': '#/definitions/RelationUnitsChange'},
++                                                                 'error': {'$ref': '#/definitions/Error'},
++                                                                 'watcher-id': {'type': 'string'}},
++                                                  'required': ['watcher-id',
++                                                               'changes'],
++                                                  'type': 'object'},
++                     'UnitSettings': {'additionalProperties': False,
++                                      'properties': {'version': {'type': 'integer'}},
++                                      'required': ['version'],
++                                      'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/RelationUnitsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(RelationUnitsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('RelationUnitsChange'), _ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RelationUnitsWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RelationUnitsWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class RemoteApplicationWatcherFacade(Type):
++    name = 'RemoteApplicationWatcher'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'RemoteApplicationChange': {'additionalProperties': False,
++                                                 'properties': {'application-tag': {'type': 'string'},
++                                                                'life': {'type': 'string'},
++                                                                'relations': {'$ref': '#/definitions/RemoteRelationsChange'}},
++                                                 'required': ['application-tag',
++                                                              'life',
++                                                              'relations'],
++                                                 'type': 'object'},
++                     'RemoteApplicationWatchResult': {'additionalProperties': False,
++                                                      'properties': {'change': {'$ref': '#/definitions/RemoteApplicationChange'},
++                                                                     'error': {'$ref': '#/definitions/Error'},
++                                                                     'id': {'type': 'string'}},
++                                                      'required': ['id'],
++                                                      'type': 'object'},
++                     'RemoteEntityId': {'additionalProperties': False,
++                                        'properties': {'model-uuid': {'type': 'string'},
++                                                       'token': {'type': 'string'}},
++                                        'required': ['model-uuid', 'token'],
++                                        'type': 'object'},
++                     'RemoteRelationChange': {'additionalProperties': False,
++                                              'properties': {'changed-units': {'patternProperties': {'.*': {'$ref': '#/definitions/RemoteRelationUnitChange'}},
++                                                                               'type': 'object'},
++                                                             'departed-units': {'items': {'type': 'string'},
++                                                                                'type': 'array'},
++                                                             'id': {'type': 'integer'},
++                                                             'life': {'type': 'string'}},
++                                              'required': ['id', 'life'],
++                                              'type': 'object'},
++                     'RemoteRelationUnitChange': {'additionalProperties': False,
++                                                  'properties': {'settings': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                           'type': 'object'}},
++                                                                              'type': 'object'},
++                                                                 'unit-id': {'$ref': '#/definitions/RemoteEntityId'}},
++                                                  'required': ['unit-id'],
++                                                  'type': 'object'},
++                     'RemoteRelationsChange': {'additionalProperties': False,
++                                               'properties': {'changed': {'items': {'$ref': '#/definitions/RemoteRelationChange'},
++                                                                          'type': 'array'},
++                                                              'initial': {'type': 'boolean'},
++                                                              'removed': {'items': {'type': 'integer'},
++                                                                          'type': 'array'}},
++                                               'required': ['initial'],
++                                               'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/RemoteApplicationWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(RemoteApplicationWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('RemoteApplicationChange'), _ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RemoteApplicationWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RemoteApplicationWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class RemoteRelationsWatcherFacade(Type):
++    name = 'RemoteRelationsWatcher'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'RemoteEntityId': {'additionalProperties': False,
++                                        'properties': {'model-uuid': {'type': 'string'},
++                                                       'token': {'type': 'string'}},
++                                        'required': ['model-uuid', 'token'],
++                                        'type': 'object'},
++                     'RemoteRelationChange': {'additionalProperties': False,
++                                              'properties': {'changed-units': {'patternProperties': {'.*': {'$ref': '#/definitions/RemoteRelationUnitChange'}},
++                                                                               'type': 'object'},
++                                                             'departed-units': {'items': {'type': 'string'},
++                                                                                'type': 'array'},
++                                                             'id': {'type': 'integer'},
++                                                             'life': {'type': 'string'}},
++                                              'required': ['id', 'life'],
++                                              'type': 'object'},
++                     'RemoteRelationUnitChange': {'additionalProperties': False,
++                                                  'properties': {'settings': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                           'type': 'object'}},
++                                                                              'type': 'object'},
++                                                                 'unit-id': {'$ref': '#/definitions/RemoteEntityId'}},
++                                                  'required': ['unit-id'],
++                                                  'type': 'object'},
++                     'RemoteRelationsChange': {'additionalProperties': False,
++                                               'properties': {'changed': {'items': {'$ref': '#/definitions/RemoteRelationChange'},
++                                                                          'type': 'array'},
++                                                              'initial': {'type': 'boolean'},
++                                                              'removed': {'items': {'type': 'integer'},
++                                                                          'type': 'array'}},
++                                               'required': ['initial'],
++                                               'type': 'object'},
++                     'RemoteRelationsWatchResult': {'additionalProperties': False,
++                                                    'properties': {'RemoteRelationsWatcherId': {'type': 'string'},
++                                                                   'change': {'$ref': '#/definitions/RemoteRelationsChange'},
++                                                                   'error': {'$ref': '#/definitions/Error'}},
++                                                    'required': ['RemoteRelationsWatcherId'],
++                                                    'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/RemoteRelationsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(RemoteRelationsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('RemoteRelationsChange'), _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RemoteRelationsWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RemoteRelationsWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ResourcesFacade(Type):
++    name = 'Resources'
++    version = 1
++    schema =     {'definitions': {'AddCharmWithAuthorization': {'additionalProperties': False,
++                                                   'properties': {'channel': {'type': 'string'},
++                                                                  'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                                  'url': {'type': 'string'}},
++                                                   'required': ['url',
++                                                                'channel',
++                                                                'macaroon'],
++                                                   'type': 'object'},
++                     'AddPendingResourcesArgs': {'additionalProperties': False,
++                                                 'properties': {'AddCharmWithAuthorization': {'$ref': '#/definitions/AddCharmWithAuthorization'},
++                                                                'Entity': {'$ref': '#/definitions/Entity'},
++                                                                'resources': {'items': {'$ref': '#/definitions/CharmResource'},
++                                                                              'type': 'array'}},
++                                                 'required': ['Entity',
++                                                              'AddCharmWithAuthorization',
++                                                              'resources'],
++                                                 'type': 'object'},
++                     'AddPendingResourcesResult': {'additionalProperties': False,
++                                                   'properties': {'ErrorResult': {'$ref': '#/definitions/ErrorResult'},
++                                                                  'pending-ids': {'items': {'type': 'string'},
++                                                                                  'type': 'array'}},
++                                                   'required': ['ErrorResult',
++                                                                'pending-ids'],
++                                                   'type': 'object'},
++                     'CharmResource': {'additionalProperties': False,
++                                       'properties': {'description': {'type': 'string'},
++                                                      'fingerprint': {'items': {'type': 'integer'},
++                                                                      'type': 'array'},
++                                                      'name': {'type': 'string'},
++                                                      'origin': {'type': 'string'},
++                                                      'path': {'type': 'string'},
++                                                      'revision': {'type': 'integer'},
++                                                      'size': {'type': 'integer'},
++                                                      'type': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'type',
++                                                    'path',
++                                                    'origin',
++                                                    'revision',
++                                                    'fingerprint',
++                                                    'size'],
++                                       'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ListResourcesArgs': {'additionalProperties': False,
++                                           'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                                       'type': 'array'}},
++                                           'required': ['entities'],
++                                           'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Resource': {'additionalProperties': False,
++                                  'properties': {'CharmResource': {'$ref': '#/definitions/CharmResource'},
++                                                 'application': {'type': 'string'},
++                                                 'id': {'type': 'string'},
++                                                 'pending-id': {'type': 'string'},
++                                                 'timestamp': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                 'username': {'type': 'string'}},
++                                  'required': ['CharmResource',
++                                               'id',
++                                               'pending-id',
++                                               'application',
++                                               'username',
++                                               'timestamp'],
++                                  'type': 'object'},
++                     'ResourcesResult': {'additionalProperties': False,
++                                         'properties': {'ErrorResult': {'$ref': '#/definitions/ErrorResult'},
++                                                        'charm-store-resources': {'items': {'$ref': '#/definitions/CharmResource'},
++                                                                                  'type': 'array'},
++                                                        'resources': {'items': {'$ref': '#/definitions/Resource'},
++                                                                      'type': 'array'},
++                                                        'unit-resources': {'items': {'$ref': '#/definitions/UnitResources'},
++                                                                           'type': 'array'}},
++                                         'required': ['ErrorResult',
++                                                      'resources',
++                                                      'charm-store-resources',
++                                                      'unit-resources'],
++                                         'type': 'object'},
++                     'ResourcesResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/ResourcesResult'},
++                                                                     'type': 'array'}},
++                                          'required': ['results'],
++                                          'type': 'object'},
++                     'UnitResources': {'additionalProperties': False,
++                                       'properties': {'Entity': {'$ref': '#/definitions/Entity'},
++                                                      'download-progress': {'patternProperties': {'.*': {'type': 'integer'}},
++                                                                            'type': 'object'},
++                                                      'resources': {'items': {'$ref': '#/definitions/Resource'},
++                                                                    'type': 'array'}},
++                                       'required': ['Entity',
++                                                    'resources',
++                                                    'download-progress'],
++                                       'type': 'object'}},
++     'properties': {'AddPendingResources': {'properties': {'Params': {'$ref': '#/definitions/AddPendingResourcesArgs'},
++                                                           'Result': {'$ref': '#/definitions/AddPendingResourcesResult'}},
++                                            'type': 'object'},
++                    'ListResources': {'properties': {'Params': {'$ref': '#/definitions/ListResourcesArgs'},
++                                                     'Result': {'$ref': '#/definitions/ResourcesResults'}},
++                                      'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddPendingResourcesResult)
++    async def AddPendingResources(self, addcharmwithauthorization, entity, resources):
++        '''
++        addcharmwithauthorization : AddCharmWithAuthorization
++        entity : Entity
++        resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource>
++        Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Resources', request='AddPendingResources', version=1, params=_params)
++        _params['AddCharmWithAuthorization'] = addcharmwithauthorization
++        _params['Entity'] = entity
++        _params['Resources'] = resources
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ResourcesResults)
++    async def ListResources(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ResourcesResult]<~ResourcesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Resources', request='ListResources', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ResourcesHookContextFacade(Type):
++    name = 'ResourcesHookContext'
++    version = 1
++    schema =     {'definitions': {'CharmResource': {'additionalProperties': False,
++                                       'properties': {'description': {'type': 'string'},
++                                                      'fingerprint': {'items': {'type': 'integer'},
++                                                                      'type': 'array'},
++                                                      'name': {'type': 'string'},
++                                                      'origin': {'type': 'string'},
++                                                      'path': {'type': 'string'},
++                                                      'revision': {'type': 'integer'},
++                                                      'size': {'type': 'integer'},
++                                                      'type': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'type',
++                                                    'path',
++                                                    'origin',
++                                                    'revision',
++                                                    'fingerprint',
++                                                    'size'],
++                                       'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ListUnitResourcesArgs': {'additionalProperties': False,
++                                               'properties': {'resource-names': {'items': {'type': 'string'},
++                                                                                 'type': 'array'}},
++                                               'required': ['resource-names'],
++                                               'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Resource': {'additionalProperties': False,
++                                  'properties': {'CharmResource': {'$ref': '#/definitions/CharmResource'},
++                                                 'application': {'type': 'string'},
++                                                 'id': {'type': 'string'},
++                                                 'pending-id': {'type': 'string'},
++                                                 'timestamp': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                 'username': {'type': 'string'}},
++                                  'required': ['CharmResource',
++                                               'id',
++                                               'pending-id',
++                                               'application',
++                                               'username',
++                                               'timestamp'],
++                                  'type': 'object'},
++                     'UnitResourceResult': {'additionalProperties': False,
++                                            'properties': {'ErrorResult': {'$ref': '#/definitions/ErrorResult'},
++                                                           'resource': {'$ref': '#/definitions/Resource'}},
++                                            'required': ['ErrorResult', 'resource'],
++                                            'type': 'object'},
++                     'UnitResourcesResult': {'additionalProperties': False,
++                                             'properties': {'ErrorResult': {'$ref': '#/definitions/ErrorResult'},
++                                                            'resources': {'items': {'$ref': '#/definitions/UnitResourceResult'},
++                                                                          'type': 'array'}},
++                                             'required': ['ErrorResult',
++                                                          'resources'],
++                                             'type': 'object'}},
++     'properties': {'GetResourceInfo': {'properties': {'Params': {'$ref': '#/definitions/ListUnitResourcesArgs'},
++                                                       'Result': {'$ref': '#/definitions/UnitResourcesResult'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(UnitResourcesResult)
++    async def GetResourceInfo(self, resource_names):
++        '''
++        resource_names : typing.Sequence<+T_co>[str]
++        Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[~UnitResourceResult]<~UnitResourceResult>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ResourcesHookContext', request='GetResourceInfo', version=1, params=_params)
++        _params['resource-names'] = resource_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class RetryStrategyFacade(Type):
++    name = 'RetryStrategy'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'RetryStrategy': {'additionalProperties': False,
++                                       'properties': {'jitter-retry-time': {'type': 'boolean'},
++                                                      'max-retry-time': {'type': 'integer'},
++                                                      'min-retry-time': {'type': 'integer'},
++                                                      'retry-time-factor': {'type': 'integer'},
++                                                      'should-retry': {'type': 'boolean'}},
++                                       'required': ['should-retry',
++                                                    'min-retry-time',
++                                                    'max-retry-time',
++                                                    'jitter-retry-time',
++                                                    'retry-time-factor'],
++                                       'type': 'object'},
++                     'RetryStrategyResult': {'additionalProperties': False,
++                                             'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                            'result': {'$ref': '#/definitions/RetryStrategy'}},
++                                             'type': 'object'},
++                     'RetryStrategyResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/RetryStrategyResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'}},
++     'properties': {'RetryStrategy': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/RetryStrategyResults'}},
++                                      'type': 'object'},
++                    'WatchRetryStrategy': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(RetryStrategyResults)
++    async def RetryStrategy(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~RetryStrategyResult]<~RetryStrategyResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RetryStrategy', request='RetryStrategy', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchRetryStrategy(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='RetryStrategy', request='WatchRetryStrategy', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SSHClientFacade(Type):
++    name = 'SSHClient'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SSHAddressResult': {'additionalProperties': False,
++                                          'properties': {'address': {'type': 'string'},
++                                                         'error': {'$ref': '#/definitions/Error'}},
++                                          'type': 'object'},
++                     'SSHAddressResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/SSHAddressResult'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'SSHProxyResult': {'additionalProperties': False,
++                                        'properties': {'use-proxy': {'type': 'boolean'}},
++                                        'required': ['use-proxy'],
++                                        'type': 'object'},
++                     'SSHPublicKeysResult': {'additionalProperties': False,
++                                             'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                            'public-keys': {'items': {'type': 'string'},
++                                                                            'type': 'array'}},
++                                             'type': 'object'},
++                     'SSHPublicKeysResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/SSHPublicKeysResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'}},
++     'properties': {'PrivateAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/SSHAddressResults'}},
++                                       'type': 'object'},
++                    'Proxy': {'properties': {'Result': {'$ref': '#/definitions/SSHProxyResult'}},
++                              'type': 'object'},
++                    'PublicAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/SSHAddressResults'}},
++                                      'type': 'object'},
++                    'PublicKeys': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/SSHPublicKeysResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(SSHAddressResults)
++    async def PrivateAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PrivateAddress', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHProxyResult)
++    async def Proxy(self):
++        '''
++
++        Returns -> bool
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='Proxy', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHAddressResults)
++    async def PublicAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PublicAddress', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHPublicKeysResults)
++    async def PublicKeys(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PublicKeys', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SingularFacade(Type):
++    name = 'Singular'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SingularClaim': {'additionalProperties': False,
++                                       'properties': {'controller-tag': {'type': 'string'},
++                                                      'duration': {'type': 'integer'},
++                                                      'model-tag': {'type': 'string'}},
++                                       'required': ['model-tag',
++                                                    'controller-tag',
++                                                    'duration'],
++                                       'type': 'object'},
++                     'SingularClaims': {'additionalProperties': False,
++                                        'properties': {'claims': {'items': {'$ref': '#/definitions/SingularClaim'},
++                                                                  'type': 'array'}},
++                                        'required': ['claims'],
++                                        'type': 'object'}},
++     'properties': {'Claim': {'properties': {'Params': {'$ref': '#/definitions/SingularClaims'},
++                                             'Result': {'$ref': '#/definitions/ErrorResults'}},
++                              'type': 'object'},
++                    'Wait': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                             'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def Claim(self, claims):
++        '''
++        claims : typing.Sequence<+T_co>[~SingularClaim]<~SingularClaim>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Singular', request='Claim', version=1, params=_params)
++        _params['claims'] = claims
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Wait(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Singular', request='Wait', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class StringsWatcherFacade(Type):
++    name = 'StringsWatcher'
++    version = 1
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StringsWatcher', request='Next', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StringsWatcher', request='Stop', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UndertakerFacade(Type):
++    name = 'Undertaker'
++    version = 1
++    schema =     {'definitions': {'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'UndertakerModelInfo': {'additionalProperties': False,
++                                             'properties': {'global-name': {'type': 'string'},
++                                                            'is-system': {'type': 'boolean'},
++                                                            'life': {'type': 'string'},
++                                                            'name': {'type': 'string'},
++                                                            'uuid': {'type': 'string'}},
++                                             'required': ['uuid',
++                                                          'name',
++                                                          'global-name',
++                                                          'is-system',
++                                                          'life'],
++                                             'type': 'object'},
++                     'UndertakerModelInfoResult': {'additionalProperties': False,
++                                                   'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                  'result': {'$ref': '#/definitions/UndertakerModelInfo'}},
++                                                   'required': ['result'],
++                                                   'type': 'object'}},
++     'properties': {'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'ModelInfo': {'properties': {'Result': {'$ref': '#/definitions/UndertakerModelInfoResult'}},
++                                  'type': 'object'},
++                    'ProcessDyingModel': {'type': 'object'},
++                    'RemoveModel': {'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'WatchModelResources': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                            'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='ModelConfig', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UndertakerModelInfoResult)
++    async def ModelInfo(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('UndertakerModelInfo')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='ModelInfo', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ProcessDyingModel(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='ProcessDyingModel', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def RemoveModel(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='RemoveModel', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='SetStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='UpdateStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchModelResources(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Undertaker', request='WatchModelResources', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UnitAssignerFacade(Type):
++    name = 'UnitAssigner'
++    version = 1
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'}},
++     'properties': {'AssignUnits': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'SetAgentStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'WatchUnitAssignments': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                                             'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AssignUnits(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UnitAssigner', request='AssignUnits', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetAgentStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UnitAssigner', request='SetAgentStatus', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResult)
++    async def WatchUnitAssignments(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UnitAssigner', request='WatchUnitAssignments', version=1, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UpgraderFacade(Type):
++    name = 'Upgrader'
++    version = 1
++    schema =     {'definitions': {'Binary': {'additionalProperties': False,
++                                'properties': {'Arch': {'type': 'string'},
++                                               'Number': {'$ref': '#/definitions/Number'},
++                                               'Series': {'type': 'string'}},
++                                'required': ['Number', 'Series', 'Arch'],
++                                'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'EntitiesVersion': {'additionalProperties': False,
++                                         'properties': {'agent-tools': {'items': {'$ref': '#/definitions/EntityVersion'},
++                                                                        'type': 'array'}},
++                                         'required': ['agent-tools'],
++                                         'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityVersion': {'additionalProperties': False,
++                                       'properties': {'tag': {'type': 'string'},
++                                                      'tools': {'$ref': '#/definitions/Version'}},
++                                       'required': ['tag', 'tools'],
++                                       'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'Tools': {'additionalProperties': False,
++                               'properties': {'sha256': {'type': 'string'},
++                                              'size': {'type': 'integer'},
++                                              'url': {'type': 'string'},
++                                              'version': {'$ref': '#/definitions/Binary'}},
++                               'required': ['version', 'url', 'size'],
++                               'type': 'object'},
++                     'ToolsResult': {'additionalProperties': False,
++                                     'properties': {'disable-ssl-hostname-verification': {'type': 'boolean'},
++                                                    'error': {'$ref': '#/definitions/Error'},
++                                                    'tools': {'items': {'$ref': '#/definitions/Tools'},
++                                                              'type': 'array'}},
++                                     'required': ['tools',
++                                                  'disable-ssl-hostname-verification'],
++                                     'type': 'object'},
++                     'ToolsResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ToolsResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Version': {'additionalProperties': False,
++                                 'properties': {'version': {'$ref': '#/definitions/Binary'}},
++                                 'required': ['version'],
++                                 'type': 'object'},
++                     'VersionResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'version': {'$ref': '#/definitions/Number'}},
++                                       'type': 'object'},
++                     'VersionResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/VersionResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'}},
++     'properties': {'DesiredVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/VersionResults'}},
++                                       'type': 'object'},
++                    'SetTools': {'properties': {'Params': {'$ref': '#/definitions/EntitiesVersion'},
++                                                'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                 'type': 'object'},
++                    'Tools': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/ToolsResults'}},
++                              'type': 'object'},
++                    'WatchAPIVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(VersionResults)
++    async def DesiredVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~VersionResult]<~VersionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Upgrader', request='DesiredVersion', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetTools(self, agent_tools):
++        '''
++        agent_tools : typing.Sequence<+T_co>[~EntityVersion]<~EntityVersion>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Upgrader', request='SetTools', version=1, params=_params)
++        _params['agent-tools'] = agent_tools
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ToolsResults)
++    async def Tools(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Upgrader', request='Tools', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchAPIVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Upgrader', request='WatchAPIVersion', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UserManagerFacade(Type):
++    name = 'UserManager'
++    version = 1
++    schema =     {'definitions': {'AddUser': {'additionalProperties': False,
++                                 'properties': {'display-name': {'type': 'string'},
++                                                'password': {'type': 'string'},
++                                                'username': {'type': 'string'}},
++                                 'required': ['username', 'display-name'],
++                                 'type': 'object'},
++                     'AddUserResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'secret-key': {'items': {'type': 'integer'},
++                                                                     'type': 'array'},
++                                                      'tag': {'type': 'string'}},
++                                       'type': 'object'},
++                     'AddUserResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/AddUserResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'AddUsers': {'additionalProperties': False,
++                                  'properties': {'users': {'items': {'$ref': '#/definitions/AddUser'},
++                                                           'type': 'array'}},
++                                  'required': ['users'],
++                                  'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityPassword': {'additionalProperties': False,
++                                        'properties': {'password': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'password'],
++                                        'type': 'object'},
++                     'EntityPasswords': {'additionalProperties': False,
++                                         'properties': {'changes': {'items': {'$ref': '#/definitions/EntityPassword'},
++                                                                    'type': 'array'}},
++                                         'required': ['changes'],
++                                         'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'UserInfo': {'additionalProperties': False,
++                                  'properties': {'access': {'type': 'string'},
++                                                 'created-by': {'type': 'string'},
++                                                 'date-created': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                 'disabled': {'type': 'boolean'},
++                                                 'display-name': {'type': 'string'},
++                                                 'last-connection': {'format': 'date-time',
++                                                                     'type': 'string'},
++                                                 'username': {'type': 'string'}},
++                                  'required': ['username',
++                                               'display-name',
++                                               'access',
++                                               'created-by',
++                                               'date-created',
++                                               'disabled'],
++                                  'type': 'object'},
++                     'UserInfoRequest': {'additionalProperties': False,
++                                         'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                                     'type': 'array'},
++                                                        'include-disabled': {'type': 'boolean'}},
++                                         'required': ['entities',
++                                                      'include-disabled'],
++                                         'type': 'object'},
++                     'UserInfoResult': {'additionalProperties': False,
++                                        'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                       'result': {'$ref': '#/definitions/UserInfo'}},
++                                        'type': 'object'},
++                     'UserInfoResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/UserInfoResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'}},
++     'properties': {'AddUser': {'properties': {'Params': {'$ref': '#/definitions/AddUsers'},
++                                               'Result': {'$ref': '#/definitions/AddUserResults'}},
++                                'type': 'object'},
++                    'DisableUser': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'EnableUser': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'RemoveUser': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'SetPassword': {'properties': {'Params': {'$ref': '#/definitions/EntityPasswords'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'UserInfo': {'properties': {'Params': {'$ref': '#/definitions/UserInfoRequest'},
++                                                'Result': {'$ref': '#/definitions/UserInfoResults'}},
++                                 'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddUserResults)
++    async def AddUser(self, users):
++        '''
++        users : typing.Sequence<+T_co>[~AddUser]<~AddUser>
++        Returns -> typing.Sequence<+T_co>[~AddUserResult]<~AddUserResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='AddUser', version=1, params=_params)
++        _params['users'] = users
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DisableUser(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='DisableUser', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnableUser(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='EnableUser', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RemoveUser(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='RemoveUser', version=1, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetPassword(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='SetPassword', version=1, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UserInfoResults)
++    async def UserInfo(self, entities, include_disabled):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        include_disabled : bool
++        Returns -> typing.Sequence<+T_co>[~UserInfoResult]<~UserInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='UserManager', request='UserInfo', version=1, params=_params)
++        _params['entities'] = entities
++        _params['include-disabled'] = include_disabled
++        reply = await self.rpc(msg)
++        return reply
++
++
index 0000000,0000000..283e803
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4227 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++from juju.client._definitions import *
++
++
++class ActionFacade(Type):
++    name = 'Action'
++    version = 2
++    schema =     {'definitions': {'Action': {'additionalProperties': False,
++                                'properties': {'name': {'type': 'string'},
++                                               'parameters': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                               'receiver': {'type': 'string'},
++                                               'tag': {'type': 'string'}},
++                                'required': ['tag', 'receiver', 'name'],
++                                'type': 'object'},
++                     'ActionResult': {'additionalProperties': False,
++                                      'properties': {'action': {'$ref': '#/definitions/Action'},
++                                                     'completed': {'format': 'date-time',
++                                                                   'type': 'string'},
++                                                     'enqueued': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'message': {'type': 'string'},
++                                                     'output': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                             'type': 'object'}},
++                                                                'type': 'object'},
++                                                     'started': {'format': 'date-time',
++                                                                 'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'type': 'object'},
++                     'ActionResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'ActionSpec': {'additionalProperties': False,
++                                    'properties': {'description': {'type': 'string'},
++                                                   'params': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'}},
++                                    'required': ['description', 'params'],
++                                    'type': 'object'},
++                     'Actions': {'additionalProperties': False,
++                                 'properties': {'actions': {'items': {'$ref': '#/definitions/Action'},
++                                                            'type': 'array'}},
++                                 'type': 'object'},
++                     'ActionsByName': {'additionalProperties': False,
++                                       'properties': {'actions': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                  'type': 'array'},
++                                                      'error': {'$ref': '#/definitions/Error'},
++                                                      'name': {'type': 'string'}},
++                                       'type': 'object'},
++                     'ActionsByNames': {'additionalProperties': False,
++                                        'properties': {'actions': {'items': {'$ref': '#/definitions/ActionsByName'},
++                                                                   'type': 'array'}},
++                                        'type': 'object'},
++                     'ActionsByReceiver': {'additionalProperties': False,
++                                           'properties': {'actions': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                      'type': 'array'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'receiver': {'type': 'string'}},
++                                           'type': 'object'},
++                     'ActionsByReceivers': {'additionalProperties': False,
++                                            'properties': {'actions': {'items': {'$ref': '#/definitions/ActionsByReceiver'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'ApplicationCharmActionsResult': {'additionalProperties': False,
++                                                       'properties': {'actions': {'patternProperties': {'.*': {'$ref': '#/definitions/ActionSpec'}},
++                                                                                  'type': 'object'},
++                                                                      'application-tag': {'type': 'string'},
++                                                                      'error': {'$ref': '#/definitions/Error'}},
++                                                       'type': 'object'},
++                     'ApplicationsCharmActionsResults': {'additionalProperties': False,
++                                                         'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationCharmActionsResult'},
++                                                                                    'type': 'array'}},
++                                                         'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'FindActionsByNames': {'additionalProperties': False,
++                                            'properties': {'names': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                            'type': 'object'},
++                     'FindTags': {'additionalProperties': False,
++                                  'properties': {'prefixes': {'items': {'type': 'string'},
++                                                              'type': 'array'}},
++                                  'required': ['prefixes'],
++                                  'type': 'object'},
++                     'FindTagsResults': {'additionalProperties': False,
++                                         'properties': {'matches': {'patternProperties': {'.*': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                                 'type': 'array'}},
++                                                                    'type': 'object'}},
++                                         'required': ['matches'],
++                                         'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'RunParams': {'additionalProperties': False,
++                                   'properties': {'applications': {'items': {'type': 'string'},
++                                                                   'type': 'array'},
++                                                  'commands': {'type': 'string'},
++                                                  'machines': {'items': {'type': 'string'},
++                                                               'type': 'array'},
++                                                  'timeout': {'type': 'integer'},
++                                                  'units': {'items': {'type': 'string'},
++                                                            'type': 'array'}},
++                                   'required': ['commands', 'timeout'],
++                                   'type': 'object'}},
++     'properties': {'Actions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ActionResults'}},
++                                'type': 'object'},
++                    'ApplicationsCharmsActions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                 'Result': {'$ref': '#/definitions/ApplicationsCharmActionsResults'}},
++                                                  'type': 'object'},
++                    'Cancel': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/ActionResults'}},
++                               'type': 'object'},
++                    'Enqueue': {'properties': {'Params': {'$ref': '#/definitions/Actions'},
++                                               'Result': {'$ref': '#/definitions/ActionResults'}},
++                                'type': 'object'},
++                    'FindActionTagsByPrefix': {'properties': {'Params': {'$ref': '#/definitions/FindTags'},
++                                                              'Result': {'$ref': '#/definitions/FindTagsResults'}},
++                                               'type': 'object'},
++                    'FindActionsByNames': {'properties': {'Params': {'$ref': '#/definitions/FindActionsByNames'},
++                                                          'Result': {'$ref': '#/definitions/ActionsByNames'}},
++                                           'type': 'object'},
++                    'ListAll': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ActionsByReceivers'}},
++                                'type': 'object'},
++                    'ListCompleted': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ActionsByReceivers'}},
++                                      'type': 'object'},
++                    'ListPending': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ActionsByReceivers'}},
++                                    'type': 'object'},
++                    'ListRunning': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ActionsByReceivers'}},
++                                    'type': 'object'},
++                    'Run': {'properties': {'Params': {'$ref': '#/definitions/RunParams'},
++                                           'Result': {'$ref': '#/definitions/ActionResults'}},
++                            'type': 'object'},
++                    'RunOnAllMachines': {'properties': {'Params': {'$ref': '#/definitions/RunParams'},
++                                                        'Result': {'$ref': '#/definitions/ActionResults'}},
++                                         'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ActionResults)
++    async def Actions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='Actions', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationsCharmActionsResults)
++    async def ApplicationsCharmsActions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ApplicationCharmActionsResult]<~ApplicationCharmActionsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='ApplicationsCharmsActions', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def Cancel(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='Cancel', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def Enqueue(self, actions):
++        '''
++        actions : typing.Sequence<+T_co>[~Action]<~Action>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='Enqueue', version=2, params=_params)
++        _params['actions'] = actions
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FindTagsResults)
++    async def FindActionTagsByPrefix(self, prefixes):
++        '''
++        prefixes : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='FindActionTagsByPrefix', version=2, params=_params)
++        _params['prefixes'] = prefixes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByNames)
++    async def FindActionsByNames(self, names):
++        '''
++        names : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~ActionsByName]<~ActionsByName>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='FindActionsByNames', version=2, params=_params)
++        _params['names'] = names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByReceivers)
++    async def ListAll(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='ListAll', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByReceivers)
++    async def ListCompleted(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='ListCompleted', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByReceivers)
++    async def ListPending(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='ListPending', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionsByReceivers)
++    async def ListRunning(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='ListRunning', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def Run(self, applications, commands, machines, timeout, units):
++        '''
++        applications : typing.Sequence<+T_co>[str]
++        commands : str
++        machines : typing.Sequence<+T_co>[str]
++        timeout : int
++        units : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='Run', version=2, params=_params)
++        _params['applications'] = applications
++        _params['commands'] = commands
++        _params['machines'] = machines
++        _params['timeout'] = timeout
++        _params['units'] = units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def RunOnAllMachines(self, applications, commands, machines, timeout, units):
++        '''
++        applications : typing.Sequence<+T_co>[str]
++        commands : str
++        machines : typing.Sequence<+T_co>[str]
++        timeout : int
++        units : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Action', request='RunOnAllMachines', version=2, params=_params)
++        _params['applications'] = applications
++        _params['commands'] = commands
++        _params['machines'] = machines
++        _params['timeout'] = timeout
++        _params['units'] = units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class AgentFacade(Type):
++    name = 'Agent'
++    version = 2
++    schema =     {'definitions': {'AgentGetEntitiesResult': {'additionalProperties': False,
++                                                'properties': {'container-type': {'type': 'string'},
++                                                               'error': {'$ref': '#/definitions/Error'},
++                                                               'jobs': {'items': {'type': 'string'},
++                                                                        'type': 'array'},
++                                                               'life': {'type': 'string'}},
++                                                'required': ['life',
++                                                             'jobs',
++                                                             'container-type'],
++                                                'type': 'object'},
++                     'AgentGetEntitiesResults': {'additionalProperties': False,
++                                                 'properties': {'entities': {'items': {'$ref': '#/definitions/AgentGetEntitiesResult'},
++                                                                             'type': 'array'}},
++                                                 'required': ['entities'],
++                                                 'type': 'object'},
++                     'CloudCredential': {'additionalProperties': False,
++                                         'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                        'auth-type': {'type': 'string'},
++                                                        'redacted': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                         'required': ['auth-type'],
++                                         'type': 'object'},
++                     'CloudSpec': {'additionalProperties': False,
++                                   'properties': {'credential': {'$ref': '#/definitions/CloudCredential'},
++                                                  'endpoint': {'type': 'string'},
++                                                  'identity-endpoint': {'type': 'string'},
++                                                  'name': {'type': 'string'},
++                                                  'region': {'type': 'string'},
++                                                  'storage-endpoint': {'type': 'string'},
++                                                  'type': {'type': 'string'}},
++                                   'required': ['type', 'name'],
++                                   'type': 'object'},
++                     'CloudSpecResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'result': {'$ref': '#/definitions/CloudSpec'}},
++                                         'type': 'object'},
++                     'CloudSpecResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/CloudSpecResult'},
++                                                                     'type': 'array'}},
++                                          'type': 'object'},
++                     'ControllerConfigResult': {'additionalProperties': False,
++                                                'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'}},
++                                                'required': ['config'],
++                                                'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityPassword': {'additionalProperties': False,
++                                        'properties': {'password': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'password'],
++                                        'type': 'object'},
++                     'EntityPasswords': {'additionalProperties': False,
++                                         'properties': {'changes': {'items': {'$ref': '#/definitions/EntityPassword'},
++                                                                    'type': 'array'}},
++                                         'required': ['changes'],
++                                         'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'IsMasterResult': {'additionalProperties': False,
++                                        'properties': {'master': {'type': 'boolean'}},
++                                        'required': ['master'],
++                                        'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'ModelTag': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'StateServingInfo': {'additionalProperties': False,
++                                          'properties': {'api-port': {'type': 'integer'},
++                                                         'ca-private-key': {'type': 'string'},
++                                                         'cert': {'type': 'string'},
++                                                         'private-key': {'type': 'string'},
++                                                         'shared-secret': {'type': 'string'},
++                                                         'state-port': {'type': 'integer'},
++                                                         'system-identity': {'type': 'string'}},
++                                          'required': ['api-port',
++                                                       'state-port',
++                                                       'cert',
++                                                       'private-key',
++                                                       'ca-private-key',
++                                                       'shared-secret',
++                                                       'system-identity'],
++                                          'type': 'object'}},
++     'properties': {'ClearReboot': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                 'Result': {'$ref': '#/definitions/CloudSpecResults'}},
++                                  'type': 'object'},
++                    'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}},
++                                         'type': 'object'},
++                    'GetCloudSpec': {'properties': {'Params': {'$ref': '#/definitions/ModelTag'},
++                                                    'Result': {'$ref': '#/definitions/CloudSpecResult'}},
++                                     'type': 'object'},
++                    'GetEntities': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/AgentGetEntitiesResults'}},
++                                    'type': 'object'},
++                    'IsMaster': {'properties': {'Result': {'$ref': '#/definitions/IsMasterResult'}},
++                                 'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'SetPasswords': {'properties': {'Params': {'$ref': '#/definitions/EntityPasswords'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'StateServingInfo': {'properties': {'Result': {'$ref': '#/definitions/StateServingInfo'}},
++                                         'type': 'object'},
++                    'WatchCredentials': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                         'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def ClearReboot(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='ClearReboot', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudSpecResults)
++    async def CloudSpec(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='CloudSpec', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ControllerConfigResult)
++    async def ControllerConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='ControllerConfig', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudSpecResult)
++    async def GetCloudSpec(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('CloudSpec')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='GetCloudSpec', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AgentGetEntitiesResults)
++    async def GetEntities(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~AgentGetEntitiesResult]<~AgentGetEntitiesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='GetEntities', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(IsMasterResult)
++    async def IsMaster(self):
++        '''
++
++        Returns -> bool
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='IsMaster', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='ModelConfig', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetPasswords(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='SetPasswords', version=2, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StateServingInfo)
++    async def StateServingInfo(self):
++        '''
++
++        Returns -> typing.Union[int, str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='StateServingInfo', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchCredentials(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='WatchCredentials', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Agent', request='WatchForModelConfigChanges', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class AllModelWatcherFacade(Type):
++    name = 'AllModelWatcher'
++    version = 2
++    schema =     {'definitions': {'AllWatcherNextResults': {'additionalProperties': False,
++                                               'properties': {'deltas': {'items': {'$ref': '#/definitions/Delta'},
++                                                                         'type': 'array'}},
++                                               'required': ['deltas'],
++                                               'type': 'object'},
++                     'Delta': {'additionalProperties': False,
++                               'properties': {'entity': {'additionalProperties': True,
++                                                         'type': 'object'},
++                                              'removed': {'type': 'boolean'}},
++                               'required': ['removed', 'entity'],
++                               'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/AllWatcherNextResults'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AllWatcherNextResults)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~Delta]<~Delta>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='AllModelWatcher', request='Next', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='AllModelWatcher', request='Stop', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class AnnotationsFacade(Type):
++    name = 'Annotations'
++    version = 2
++    schema =     {'definitions': {'AnnotationsGetResult': {'additionalProperties': False,
++                                              'properties': {'annotations': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                             'type': 'object'},
++                                                             'entity': {'type': 'string'},
++                                                             'error': {'$ref': '#/definitions/ErrorResult'}},
++                                              'required': ['entity', 'annotations'],
++                                              'type': 'object'},
++                     'AnnotationsGetResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/AnnotationsGetResult'},
++                                                                          'type': 'array'}},
++                                               'required': ['results'],
++                                               'type': 'object'},
++                     'AnnotationsSet': {'additionalProperties': False,
++                                        'properties': {'annotations': {'items': {'$ref': '#/definitions/EntityAnnotations'},
++                                                                       'type': 'array'}},
++                                        'required': ['annotations'],
++                                        'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityAnnotations': {'additionalProperties': False,
++                                           'properties': {'annotations': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                          'type': 'object'},
++                                                          'entity': {'type': 'string'}},
++                                           'required': ['entity', 'annotations'],
++                                           'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'Get': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                           'Result': {'$ref': '#/definitions/AnnotationsGetResults'}},
++                            'type': 'object'},
++                    'Set': {'properties': {'Params': {'$ref': '#/definitions/AnnotationsSet'},
++                                           'Result': {'$ref': '#/definitions/ErrorResults'}},
++                            'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AnnotationsGetResults)
++    async def Get(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~AnnotationsGetResult]<~AnnotationsGetResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Annotations', request='Get', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Set(self, annotations):
++        '''
++        annotations : typing.Sequence<+T_co>[~EntityAnnotations]<~EntityAnnotations>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Annotations', request='Set', version=2, params=_params)
++        _params['annotations'] = annotations
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ApplicationFacade(Type):
++    name = 'Application'
++    version = 2
++    schema =     {'definitions': {'AddApplicationUnits': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'num-units': {'type': 'integer'},
++                                                            'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                          'type': 'array'}},
++                                             'required': ['application',
++                                                          'num-units',
++                                                          'placement'],
++                                             'type': 'object'},
++                     'AddApplicationUnitsResults': {'additionalProperties': False,
++                                                    'properties': {'units': {'items': {'type': 'string'},
++                                                                             'type': 'array'}},
++                                                    'required': ['units'],
++                                                    'type': 'object'},
++                     'AddRelation': {'additionalProperties': False,
++                                     'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                     'required': ['endpoints'],
++                                     'type': 'object'},
++                     'AddRelationResults': {'additionalProperties': False,
++                                            'properties': {'endpoints': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                                         'type': 'object'}},
++                                            'required': ['endpoints'],
++                                            'type': 'object'},
++                     'ApplicationCharmRelations': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'ApplicationCharmRelationsResults': {'additionalProperties': False,
++                                                          'properties': {'charm-relations': {'items': {'type': 'string'},
++                                                                                             'type': 'array'}},
++                                                          'required': ['charm-relations'],
++                                                          'type': 'object'},
++                     'ApplicationDeploy': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'channel': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'config': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                     'type': 'object'},
++                                                          'config-yaml': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                          'num-units': {'type': 'integer'},
++                                                          'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                        'type': 'array'},
++                                                          'resources': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                        'type': 'object'},
++                                                          'series': {'type': 'string'},
++                                                          'storage': {'patternProperties': {'.*': {'$ref': '#/definitions/Constraints'}},
++                                                                      'type': 'object'}},
++                                           'required': ['application',
++                                                        'series',
++                                                        'charm-url',
++                                                        'channel',
++                                                        'num-units',
++                                                        'config-yaml',
++                                                        'constraints'],
++                                           'type': 'object'},
++                     'ApplicationDestroy': {'additionalProperties': False,
++                                            'properties': {'application': {'type': 'string'}},
++                                            'required': ['application'],
++                                            'type': 'object'},
++                     'ApplicationExpose': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'}},
++                                           'required': ['application'],
++                                           'type': 'object'},
++                     'ApplicationGet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'}},
++                                        'required': ['application'],
++                                        'type': 'object'},
++                     'ApplicationGetResults': {'additionalProperties': False,
++                                               'properties': {'application': {'type': 'string'},
++                                                              'charm': {'type': 'string'},
++                                                              'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                      'type': 'object'}},
++                                                                         'type': 'object'},
++                                                              'constraints': {'$ref': '#/definitions/Value'},
++                                                              'series': {'type': 'string'}},
++                                               'required': ['application',
++                                                            'charm',
++                                                            'config',
++                                                            'constraints',
++                                                            'series'],
++                                               'type': 'object'},
++                     'ApplicationMetricCredential': {'additionalProperties': False,
++                                                     'properties': {'application': {'type': 'string'},
++                                                                    'metrics-credentials': {'items': {'type': 'integer'},
++                                                                                            'type': 'array'}},
++                                                     'required': ['application',
++                                                                  'metrics-credentials'],
++                                                     'type': 'object'},
++                     'ApplicationMetricCredentials': {'additionalProperties': False,
++                                                      'properties': {'creds': {'items': {'$ref': '#/definitions/ApplicationMetricCredential'},
++                                                                               'type': 'array'}},
++                                                      'required': ['creds'],
++                                                      'type': 'object'},
++                     'ApplicationSet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'options': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                   'type': 'object'}},
++                                        'required': ['application', 'options'],
++                                        'type': 'object'},
++                     'ApplicationSetCharm': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'channel': {'type': 'string'},
++                                                            'charm-url': {'type': 'string'},
++                                                            'config-settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                            'config-settings-yaml': {'type': 'string'},
++                                                            'force-series': {'type': 'boolean'},
++                                                            'force-units': {'type': 'boolean'},
++                                                            'resource-ids': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                             'type': 'object'},
++                                                            'storage-constraints': {'patternProperties': {'.*': {'$ref': '#/definitions/StorageConstraints'}},
++                                                                                    'type': 'object'}},
++                                             'required': ['application',
++                                                          'charm-url',
++                                                          'channel',
++                                                          'force-units',
++                                                          'force-series'],
++                                             'type': 'object'},
++                     'ApplicationUnexpose': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'}},
++                                             'required': ['application'],
++                                             'type': 'object'},
++                     'ApplicationUnset': {'additionalProperties': False,
++                                          'properties': {'application': {'type': 'string'},
++                                                         'options': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                          'required': ['application', 'options'],
++                                          'type': 'object'},
++                     'ApplicationUpdate': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'force-charm-url': {'type': 'boolean'},
++                                                          'force-series': {'type': 'boolean'},
++                                                          'min-units': {'type': 'integer'},
++                                                          'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                       'type': 'object'},
++                                                          'settings-yaml': {'type': 'string'}},
++                                           'required': ['application',
++                                                        'charm-url',
++                                                        'force-charm-url',
++                                                        'force-series',
++                                                        'settings-yaml'],
++                                           'type': 'object'},
++                     'ApplicationsDeploy': {'additionalProperties': False,
++                                            'properties': {'applications': {'items': {'$ref': '#/definitions/ApplicationDeploy'},
++                                                                            'type': 'array'}},
++                                            'required': ['applications'],
++                                            'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'DestroyApplicationUnits': {'additionalProperties': False,
++                                                 'properties': {'unit-names': {'items': {'type': 'string'},
++                                                                               'type': 'array'}},
++                                                 'required': ['unit-names'],
++                                                 'type': 'object'},
++                     'DestroyRelation': {'additionalProperties': False,
++                                         'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                      'type': 'array'}},
++                                         'required': ['endpoints'],
++                                         'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetApplicationConstraints': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'GetConstraintsResults': {'additionalProperties': False,
++                                               'properties': {'constraints': {'$ref': '#/definitions/Value'}},
++                                               'required': ['constraints'],
++                                               'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'SetConstraints': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'constraints': {'$ref': '#/definitions/Value'}},
++                                        'required': ['application', 'constraints'],
++                                        'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddRelation': {'properties': {'Params': {'$ref': '#/definitions/AddRelation'},
++                                                   'Result': {'$ref': '#/definitions/AddRelationResults'}},
++                                    'type': 'object'},
++                    'AddUnits': {'properties': {'Params': {'$ref': '#/definitions/AddApplicationUnits'},
++                                                'Result': {'$ref': '#/definitions/AddApplicationUnitsResults'}},
++                                 'type': 'object'},
++                    'CharmRelations': {'properties': {'Params': {'$ref': '#/definitions/ApplicationCharmRelations'},
++                                                      'Result': {'$ref': '#/definitions/ApplicationCharmRelationsResults'}},
++                                       'type': 'object'},
++                    'Deploy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationsDeploy'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationDestroy'}},
++                                'type': 'object'},
++                    'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}},
++                                        'type': 'object'},
++                    'DestroyUnits': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationUnits'}},
++                                     'type': 'object'},
++                    'Expose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationExpose'}},
++                               'type': 'object'},
++                    'Get': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                           'Result': {'$ref': '#/definitions/ApplicationGetResults'}},
++                            'type': 'object'},
++                    'GetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                                   'Result': {'$ref': '#/definitions/StringResult'}},
++                                    'type': 'object'},
++                    'GetConstraints': {'properties': {'Params': {'$ref': '#/definitions/GetApplicationConstraints'},
++                                                      'Result': {'$ref': '#/definitions/GetConstraintsResults'}},
++                                       'type': 'object'},
++                    'Set': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSet'}},
++                            'type': 'object'},
++                    'SetCharm': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharm'}},
++                                 'type': 'object'},
++                    'SetConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}},
++                                       'type': 'object'},
++                    'SetMetricCredentials': {'properties': {'Params': {'$ref': '#/definitions/ApplicationMetricCredentials'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'Unexpose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnexpose'}},
++                                 'type': 'object'},
++                    'Unset': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnset'}},
++                              'type': 'object'},
++                    'Update': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUpdate'}},
++                               'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddRelationResults)
++    async def AddRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddRelation', version=2, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddApplicationUnitsResults)
++    async def AddUnits(self, application, num_units, placement):
++        '''
++        application : str
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddUnits', version=2, params=_params)
++        _params['application'] = application
++        _params['num-units'] = num_units
++        _params['placement'] = placement
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationCharmRelationsResults)
++    async def CharmRelations(self, application):
++        '''
++        application : str
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='CharmRelations', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Deploy(self, applications):
++        '''
++        applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Deploy', version=2, params=_params)
++        _params['applications'] = applications
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Destroy(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Destroy', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyRelation', version=2, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyUnits(self, unit_names):
++        '''
++        unit_names : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnits', version=2, params=_params)
++        _params['unit-names'] = unit_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Expose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Expose', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationGetResults)
++    async def Get(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Get', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def GetCharmURL(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetCharmURL', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetConstraintsResults)
++    async def GetConstraints(self, application):
++        '''
++        application : str
++        Returns -> Value
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetConstraints', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Set(self, application, options):
++        '''
++        application : str
++        options : typing.Mapping<~KT, +VT_co>[str, str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Set', version=2, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetCharm(self, application, channel, charm_url, config_settings, config_settings_yaml, force_series, force_units, resource_ids, storage_constraints):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config_settings : typing.Mapping<~KT, +VT_co>[str, str]
++        config_settings_yaml : str
++        force_series : bool
++        force_units : bool
++        resource_ids : typing.Mapping<~KT, +VT_co>[str, str]
++        storage_constraints : typing.Mapping<~KT, +VT_co>[str, ~StorageConstraints]<~StorageConstraints>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetCharm', version=2, params=_params)
++        _params['application'] = application
++        _params['channel'] = channel
++        _params['charm-url'] = charm_url
++        _params['config-settings'] = config_settings
++        _params['config-settings-yaml'] = config_settings_yaml
++        _params['force-series'] = force_series
++        _params['force-units'] = force_units
++        _params['resource-ids'] = resource_ids
++        _params['storage-constraints'] = storage_constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetConstraints(self, application, constraints):
++        '''
++        application : str
++        constraints : Value
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetConstraints', version=2, params=_params)
++        _params['application'] = application
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMetricCredentials(self, creds):
++        '''
++        creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetMetricCredentials', version=2, params=_params)
++        _params['creds'] = creds
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unexpose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unexpose', version=2, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unset(self, application, options):
++        '''
++        application : str
++        options : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unset', version=2, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Update(self, application, charm_url, constraints, force_charm_url, force_series, min_units, settings, settings_yaml):
++        '''
++        application : str
++        charm_url : str
++        constraints : Value
++        force_charm_url : bool
++        force_series : bool
++        min_units : int
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        settings_yaml : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Update', version=2, params=_params)
++        _params['application'] = application
++        _params['charm-url'] = charm_url
++        _params['constraints'] = constraints
++        _params['force-charm-url'] = force_charm_url
++        _params['force-series'] = force_series
++        _params['min-units'] = min_units
++        _params['settings'] = settings
++        _params['settings-yaml'] = settings_yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class BlockFacade(Type):
++    name = 'Block'
++    version = 2
++    schema =     {'definitions': {'Block': {'additionalProperties': False,
++                               'properties': {'id': {'type': 'string'},
++                                              'message': {'type': 'string'},
++                                              'tag': {'type': 'string'},
++                                              'type': {'type': 'string'}},
++                               'required': ['id', 'tag', 'type'],
++                               'type': 'object'},
++                     'BlockResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                    'result': {'$ref': '#/definitions/Block'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'BlockResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/BlockResult'},
++                                                                 'type': 'array'}},
++                                      'type': 'object'},
++                     'BlockSwitchParams': {'additionalProperties': False,
++                                           'properties': {'message': {'type': 'string'},
++                                                          'type': {'type': 'string'}},
++                                           'required': ['type'],
++                                           'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'List': {'properties': {'Result': {'$ref': '#/definitions/BlockResults'}},
++                             'type': 'object'},
++                    'SwitchBlockOff': {'properties': {'Params': {'$ref': '#/definitions/BlockSwitchParams'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResult'}},
++                                       'type': 'object'},
++                    'SwitchBlockOn': {'properties': {'Params': {'$ref': '#/definitions/BlockSwitchParams'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResult'}},
++                                      'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(BlockResults)
++    async def List(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~BlockResult]<~BlockResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Block', request='List', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResult)
++    async def SwitchBlockOff(self, message, type_):
++        '''
++        message : str
++        type_ : str
++        Returns -> Error
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Block', request='SwitchBlockOff', version=2, params=_params)
++        _params['message'] = message
++        _params['type'] = type_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResult)
++    async def SwitchBlockOn(self, message, type_):
++        '''
++        message : str
++        type_ : str
++        Returns -> Error
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Block', request='SwitchBlockOn', version=2, params=_params)
++        _params['message'] = message
++        _params['type'] = type_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class CharmRevisionUpdaterFacade(Type):
++    name = 'CharmRevisionUpdater'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'UpdateLatestRevisions': {'properties': {'Result': {'$ref': '#/definitions/ErrorResult'}},
++                                              'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResult)
++    async def UpdateLatestRevisions(self):
++        '''
++
++        Returns -> Error
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='CharmRevisionUpdater', request='UpdateLatestRevisions', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class CharmsFacade(Type):
++    name = 'Charms'
++    version = 2
++    schema =     {'definitions': {'CharmActionSpec': {'additionalProperties': False,
++                                         'properties': {'description': {'type': 'string'},
++                                                        'params': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                'type': 'object'}},
++                                                                   'type': 'object'}},
++                                         'required': ['description', 'params'],
++                                         'type': 'object'},
++                     'CharmActions': {'additionalProperties': False,
++                                      'properties': {'specs': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmActionSpec'}},
++                                                               'type': 'object'}},
++                                      'type': 'object'},
++                     'CharmInfo': {'additionalProperties': False,
++                                   'properties': {'actions': {'$ref': '#/definitions/CharmActions'},
++                                                  'config': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmOption'}},
++                                                             'type': 'object'},
++                                                  'meta': {'$ref': '#/definitions/CharmMeta'},
++                                                  'metrics': {'$ref': '#/definitions/CharmMetrics'},
++                                                  'revision': {'type': 'integer'},
++                                                  'url': {'type': 'string'}},
++                                   'required': ['revision', 'url', 'config'],
++                                   'type': 'object'},
++                     'CharmMeta': {'additionalProperties': False,
++                                   'properties': {'categories': {'items': {'type': 'string'},
++                                                                 'type': 'array'},
++                                                  'description': {'type': 'string'},
++                                                  'extra-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                     'type': 'object'},
++                                                  'min-juju-version': {'type': 'string'},
++                                                  'name': {'type': 'string'},
++                                                  'payload-classes': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmPayloadClass'}},
++                                                                      'type': 'object'},
++                                                  'peers': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                            'type': 'object'},
++                                                  'provides': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                               'type': 'object'},
++                                                  'requires': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                               'type': 'object'},
++                                                  'resources': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmResourceMeta'}},
++                                                                'type': 'object'},
++                                                  'series': {'items': {'type': 'string'},
++                                                             'type': 'array'},
++                                                  'storage': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmStorage'}},
++                                                              'type': 'object'},
++                                                  'subordinate': {'type': 'boolean'},
++                                                  'summary': {'type': 'string'},
++                                                  'tags': {'items': {'type': 'string'},
++                                                           'type': 'array'},
++                                                  'terms': {'items': {'type': 'string'},
++                                                            'type': 'array'}},
++                                   'required': ['name',
++                                                'summary',
++                                                'description',
++                                                'subordinate'],
++                                   'type': 'object'},
++                     'CharmMetric': {'additionalProperties': False,
++                                     'properties': {'description': {'type': 'string'},
++                                                    'type': {'type': 'string'}},
++                                     'required': ['type', 'description'],
++                                     'type': 'object'},
++                     'CharmMetrics': {'additionalProperties': False,
++                                      'properties': {'metrics': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmMetric'}},
++                                                                 'type': 'object'},
++                                                     'plan': {'$ref': '#/definitions/CharmPlan'}},
++                                      'required': ['metrics', 'plan'],
++                                      'type': 'object'},
++                     'CharmOption': {'additionalProperties': False,
++                                     'properties': {'default': {'additionalProperties': True,
++                                                                'type': 'object'},
++                                                    'description': {'type': 'string'},
++                                                    'type': {'type': 'string'}},
++                                     'required': ['type'],
++                                     'type': 'object'},
++                     'CharmPayloadClass': {'additionalProperties': False,
++                                           'properties': {'name': {'type': 'string'},
++                                                          'type': {'type': 'string'}},
++                                           'required': ['name', 'type'],
++                                           'type': 'object'},
++                     'CharmPlan': {'additionalProperties': False,
++                                   'properties': {'required': {'type': 'boolean'}},
++                                   'required': ['required'],
++                                   'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'CharmResourceMeta': {'additionalProperties': False,
++                                           'properties': {'description': {'type': 'string'},
++                                                          'name': {'type': 'string'},
++                                                          'path': {'type': 'string'},
++                                                          'type': {'type': 'string'}},
++                                           'required': ['name',
++                                                        'type',
++                                                        'path',
++                                                        'description'],
++                                           'type': 'object'},
++                     'CharmStorage': {'additionalProperties': False,
++                                      'properties': {'count-max': {'type': 'integer'},
++                                                     'count-min': {'type': 'integer'},
++                                                     'description': {'type': 'string'},
++                                                     'location': {'type': 'string'},
++                                                     'minimum-size': {'type': 'integer'},
++                                                     'name': {'type': 'string'},
++                                                     'properties': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                     'read-only': {'type': 'boolean'},
++                                                     'shared': {'type': 'boolean'},
++                                                     'type': {'type': 'string'}},
++                                      'required': ['name',
++                                                   'description',
++                                                   'type',
++                                                   'shared',
++                                                   'read-only',
++                                                   'count-min',
++                                                   'count-max',
++                                                   'minimum-size'],
++                                      'type': 'object'},
++                     'CharmURL': {'additionalProperties': False,
++                                  'properties': {'url': {'type': 'string'}},
++                                  'required': ['url'],
++                                  'type': 'object'},
++                     'CharmsList': {'additionalProperties': False,
++                                    'properties': {'names': {'items': {'type': 'string'},
++                                                             'type': 'array'}},
++                                    'required': ['names'],
++                                    'type': 'object'},
++                     'CharmsListResult': {'additionalProperties': False,
++                                          'properties': {'charm-urls': {'items': {'type': 'string'},
++                                                                        'type': 'array'}},
++                                          'required': ['charm-urls'],
++                                          'type': 'object'},
++                     'IsMeteredResult': {'additionalProperties': False,
++                                         'properties': {'metered': {'type': 'boolean'}},
++                                         'required': ['metered'],
++                                         'type': 'object'}},
++     'properties': {'CharmInfo': {'properties': {'Params': {'$ref': '#/definitions/CharmURL'},
++                                                 'Result': {'$ref': '#/definitions/CharmInfo'}},
++                                  'type': 'object'},
++                    'IsMetered': {'properties': {'Params': {'$ref': '#/definitions/CharmURL'},
++                                                 'Result': {'$ref': '#/definitions/IsMeteredResult'}},
++                                  'type': 'object'},
++                    'List': {'properties': {'Params': {'$ref': '#/definitions/CharmsList'},
++                                            'Result': {'$ref': '#/definitions/CharmsListResult'}},
++                             'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(CharmInfo)
++    async def CharmInfo(self, url):
++        '''
++        url : str
++        Returns -> typing.Union[_ForwardRef('CharmActions'), typing.Mapping<~KT, +VT_co>[str, ~CharmOption]<~CharmOption>, _ForwardRef('CharmMeta'), _ForwardRef('CharmMetrics'), int, str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Charms', request='CharmInfo', version=2, params=_params)
++        _params['url'] = url
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(IsMeteredResult)
++    async def IsMetered(self, url):
++        '''
++        url : str
++        Returns -> bool
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Charms', request='IsMetered', version=2, params=_params)
++        _params['url'] = url
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CharmsListResult)
++    async def List(self, names):
++        '''
++        names : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Charms', request='List', version=2, params=_params)
++        _params['names'] = names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class CleanerFacade(Type):
++    name = 'Cleaner'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'}},
++     'properties': {'Cleanup': {'type': 'object'},
++                    'WatchCleanups': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                      'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def Cleanup(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cleaner', request='Cleanup', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchCleanups(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Cleaner', request='WatchCleanups', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class DiscoverSpacesFacade(Type):
++    name = 'DiscoverSpaces'
++    version = 2
++    schema =     {'definitions': {'AddSubnetParams': {'additionalProperties': False,
++                                         'properties': {'provider-network-id': {'type': 'string'},
++                                                        'space-tag': {'type': 'string'},
++                                                        'subnet-provider-id': {'type': 'string'},
++                                                        'subnet-tag': {'type': 'string'},
++                                                        'vlan-tag': {'type': 'integer'},
++                                                        'zones': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                         'required': ['space-tag'],
++                                         'type': 'object'},
++                     'AddSubnetsParams': {'additionalProperties': False,
++                                          'properties': {'subnets': {'items': {'$ref': '#/definitions/AddSubnetParams'},
++                                                                     'type': 'array'}},
++                                          'required': ['subnets'],
++                                          'type': 'object'},
++                     'CreateSpaceParams': {'additionalProperties': False,
++                                           'properties': {'provider-id': {'type': 'string'},
++                                                          'public': {'type': 'boolean'},
++                                                          'space-tag': {'type': 'string'},
++                                                          'subnet-tags': {'items': {'type': 'string'},
++                                                                          'type': 'array'}},
++                                           'required': ['subnet-tags',
++                                                        'space-tag',
++                                                        'public'],
++                                           'type': 'object'},
++                     'CreateSpacesParams': {'additionalProperties': False,
++                                            'properties': {'spaces': {'items': {'$ref': '#/definitions/CreateSpaceParams'},
++                                                                      'type': 'array'}},
++                                            'required': ['spaces'],
++                                            'type': 'object'},
++                     'DiscoverSpacesResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/ProviderSpace'},
++                                                                          'type': 'array'}},
++                                               'required': ['results'],
++                                               'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ListSubnetsResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/Subnet'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'ProviderSpace': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'name': {'type': 'string'},
++                                                      'provider-id': {'type': 'string'},
++                                                      'subnets': {'items': {'$ref': '#/definitions/Subnet'},
++                                                                  'type': 'array'}},
++                                       'required': ['name',
++                                                    'provider-id',
++                                                    'subnets'],
++                                       'type': 'object'},
++                     'Subnet': {'additionalProperties': False,
++                                'properties': {'cidr': {'type': 'string'},
++                                               'life': {'type': 'string'},
++                                               'provider-id': {'type': 'string'},
++                                               'provider-network-id': {'type': 'string'},
++                                               'provider-space-id': {'type': 'string'},
++                                               'space-tag': {'type': 'string'},
++                                               'status': {'type': 'string'},
++                                               'vlan-tag': {'type': 'integer'},
++                                               'zones': {'items': {'type': 'string'},
++                                                         'type': 'array'}},
++                                'required': ['cidr',
++                                             'vlan-tag',
++                                             'life',
++                                             'space-tag',
++                                             'zones'],
++                                'type': 'object'},
++                     'SubnetsFilters': {'additionalProperties': False,
++                                        'properties': {'space-tag': {'type': 'string'},
++                                                       'zone': {'type': 'string'}},
++                                        'type': 'object'}},
++     'properties': {'AddSubnets': {'properties': {'Params': {'$ref': '#/definitions/AddSubnetsParams'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'CreateSpaces': {'properties': {'Params': {'$ref': '#/definitions/CreateSpacesParams'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'ListSpaces': {'properties': {'Result': {'$ref': '#/definitions/DiscoverSpacesResults'}},
++                                   'type': 'object'},
++                    'ListSubnets': {'properties': {'Params': {'$ref': '#/definitions/SubnetsFilters'},
++                                                   'Result': {'$ref': '#/definitions/ListSubnetsResults'}},
++                                    'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AddSubnets(self, subnets):
++        '''
++        subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiscoverSpaces', request='AddSubnets', version=2, params=_params)
++        _params['subnets'] = subnets
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def CreateSpaces(self, spaces):
++        '''
++        spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiscoverSpaces', request='CreateSpaces', version=2, params=_params)
++        _params['spaces'] = spaces
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DiscoverSpacesResults)
++    async def ListSpaces(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~ProviderSpace]<~ProviderSpace>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiscoverSpaces', request='ListSpaces', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListSubnetsResults)
++    async def ListSubnets(self, space_tag, zone):
++        '''
++        space_tag : str
++        zone : str
++        Returns -> typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiscoverSpaces', request='ListSubnets', version=2, params=_params)
++        _params['space-tag'] = space_tag
++        _params['zone'] = zone
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiscoverSpaces', request='ModelConfig', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class DiskManagerFacade(Type):
++    name = 'DiskManager'
++    version = 2
++    schema =     {'definitions': {'BlockDevice': {'additionalProperties': False,
++                                     'properties': {'BusAddress': {'type': 'string'},
++                                                    'DeviceLinks': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                    'DeviceName': {'type': 'string'},
++                                                    'FilesystemType': {'type': 'string'},
++                                                    'HardwareId': {'type': 'string'},
++                                                    'InUse': {'type': 'boolean'},
++                                                    'Label': {'type': 'string'},
++                                                    'MountPoint': {'type': 'string'},
++                                                    'Size': {'type': 'integer'},
++                                                    'UUID': {'type': 'string'},
++                                                    'WWN': {'type': 'string'}},
++                                     'required': ['DeviceName',
++                                                  'DeviceLinks',
++                                                  'Label',
++                                                  'UUID',
++                                                  'HardwareId',
++                                                  'WWN',
++                                                  'BusAddress',
++                                                  'Size',
++                                                  'FilesystemType',
++                                                  'InUse',
++                                                  'MountPoint'],
++                                     'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineBlockDevices': {'additionalProperties': False,
++                                             'properties': {'block-devices': {'items': {'$ref': '#/definitions/BlockDevice'},
++                                                                              'type': 'array'},
++                                                            'machine': {'type': 'string'}},
++                                             'required': ['machine'],
++                                             'type': 'object'},
++                     'SetMachineBlockDevices': {'additionalProperties': False,
++                                                'properties': {'machine-block-devices': {'items': {'$ref': '#/definitions/MachineBlockDevices'},
++                                                                                         'type': 'array'}},
++                                                'required': ['machine-block-devices'],
++                                                'type': 'object'}},
++     'properties': {'SetMachineBlockDevices': {'properties': {'Params': {'$ref': '#/definitions/SetMachineBlockDevices'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def SetMachineBlockDevices(self, machine_block_devices):
++        '''
++        machine_block_devices : typing.Sequence<+T_co>[~MachineBlockDevices]<~MachineBlockDevices>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='DiskManager', request='SetMachineBlockDevices', version=2, params=_params)
++        _params['machine-block-devices'] = machine_block_devices
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class EntityWatcherFacade(Type):
++    name = 'EntityWatcher'
++    version = 2
++    schema =     {'definitions': {'EntitiesWatchResult': {'additionalProperties': False,
++                                             'properties': {'changes': {'items': {'type': 'string'},
++                                                                        'type': 'array'},
++                                                            'error': {'$ref': '#/definitions/Error'},
++                                                            'watcher-id': {'type': 'string'}},
++                                             'required': ['watcher-id'],
++                                             'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/EntitiesWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(EntitiesWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='EntityWatcher', request='Next', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='EntityWatcher', request='Stop', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class FilesystemAttachmentsWatcherFacade(Type):
++    name = 'FilesystemAttachmentsWatcher'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineStorageId': {'additionalProperties': False,
++                                          'properties': {'attachment-tag': {'type': 'string'},
++                                                         'machine-tag': {'type': 'string'}},
++                                          'required': ['machine-tag',
++                                                       'attachment-tag'],
++                                          'type': 'object'},
++                     'MachineStorageIdsWatchResult': {'additionalProperties': False,
++                                                      'properties': {'changes': {'items': {'$ref': '#/definitions/MachineStorageId'},
++                                                                                 'type': 'array'},
++                                                                     'error': {'$ref': '#/definitions/Error'},
++                                                                     'watcher-id': {'type': 'string'}},
++                                                      'required': ['watcher-id',
++                                                                   'changes'],
++                                                      'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/MachineStorageIdsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(MachineStorageIdsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='FilesystemAttachmentsWatcher', request='Next', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='FilesystemAttachmentsWatcher', request='Stop', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class HighAvailabilityFacade(Type):
++    name = 'HighAvailability'
++    version = 2
++    schema =     {'definitions': {'Address': {'additionalProperties': False,
++                                 'properties': {'Scope': {'type': 'string'},
++                                                'SpaceName': {'type': 'string'},
++                                                'SpaceProviderId': {'type': 'string'},
++                                                'Type': {'type': 'string'},
++                                                'Value': {'type': 'string'}},
++                                 'required': ['Value',
++                                              'Type',
++                                              'Scope',
++                                              'SpaceName',
++                                              'SpaceProviderId'],
++                                 'type': 'object'},
++                     'ControllersChangeResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'result': {'$ref': '#/definitions/ControllersChanges'}},
++                                                 'required': ['result'],
++                                                 'type': 'object'},
++                     'ControllersChangeResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/ControllersChangeResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'ControllersChanges': {'additionalProperties': False,
++                                            'properties': {'added': {'items': {'type': 'string'},
++                                                                     'type': 'array'},
++                                                           'converted': {'items': {'type': 'string'},
++                                                                         'type': 'array'},
++                                                           'demoted': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'maintained': {'items': {'type': 'string'},
++                                                                          'type': 'array'},
++                                                           'promoted': {'items': {'type': 'string'},
++                                                                        'type': 'array'},
++                                                           'removed': {'items': {'type': 'string'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'ControllersSpec': {'additionalProperties': False,
++                                         'properties': {'constraints': {'$ref': '#/definitions/Value'},
++                                                        'num-controllers': {'type': 'integer'},
++                                                        'placement': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                        'series': {'type': 'string'}},
++                                         'required': ['num-controllers'],
++                                         'type': 'object'},
++                     'ControllersSpecs': {'additionalProperties': False,
++                                          'properties': {'specs': {'items': {'$ref': '#/definitions/ControllersSpec'},
++                                                                   'type': 'array'}},
++                                          'required': ['specs'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'HAMember': {'additionalProperties': False,
++                                  'properties': {'public-address': {'$ref': '#/definitions/Address'},
++                                                 'series': {'type': 'string'},
++                                                 'tag': {'type': 'string'}},
++                                  'required': ['tag', 'public-address', 'series'],
++                                  'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Member': {'additionalProperties': False,
++                                'properties': {'Address': {'type': 'string'},
++                                               'Arbiter': {'type': 'boolean'},
++                                               'BuildIndexes': {'type': 'boolean'},
++                                               'Hidden': {'type': 'boolean'},
++                                               'Id': {'type': 'integer'},
++                                               'Priority': {'type': 'number'},
++                                               'SlaveDelay': {'type': 'integer'},
++                                               'Tags': {'patternProperties': {'.*': {'type': 'string'}},
++                                                        'type': 'object'},
++                                               'Votes': {'type': 'integer'}},
++                                'required': ['Id',
++                                             'Address',
++                                             'Arbiter',
++                                             'BuildIndexes',
++                                             'Hidden',
++                                             'Priority',
++                                             'Tags',
++                                             'SlaveDelay',
++                                             'Votes'],
++                                'type': 'object'},
++                     'MongoUpgradeResults': {'additionalProperties': False,
++                                             'properties': {'ha-members': {'items': {'$ref': '#/definitions/HAMember'},
++                                                                           'type': 'array'},
++                                                            'master': {'$ref': '#/definitions/HAMember'},
++                                                            'rs-members': {'items': {'$ref': '#/definitions/Member'},
++                                                                           'type': 'array'}},
++                                             'required': ['rs-members',
++                                                          'master',
++                                                          'ha-members'],
++                                             'type': 'object'},
++                     'MongoVersion': {'additionalProperties': False,
++                                      'properties': {'engine': {'type': 'string'},
++                                                     'major': {'type': 'integer'},
++                                                     'minor': {'type': 'integer'},
++                                                     'patch': {'type': 'string'}},
++                                      'required': ['major',
++                                                   'minor',
++                                                   'patch',
++                                                   'engine'],
++                                      'type': 'object'},
++                     'ResumeReplicationParams': {'additionalProperties': False,
++                                                 'properties': {'members': {'items': {'$ref': '#/definitions/Member'},
++                                                                            'type': 'array'}},
++                                                 'required': ['members'],
++                                                 'type': 'object'},
++                     'UpgradeMongoParams': {'additionalProperties': False,
++                                            'properties': {'target': {'$ref': '#/definitions/MongoVersion'}},
++                                            'required': ['target'],
++                                            'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'EnableHA': {'properties': {'Params': {'$ref': '#/definitions/ControllersSpecs'},
++                                                'Result': {'$ref': '#/definitions/ControllersChangeResults'}},
++                                 'type': 'object'},
++                    'ResumeHAReplicationAfterUpgrade': {'properties': {'Params': {'$ref': '#/definitions/ResumeReplicationParams'}},
++                                                        'type': 'object'},
++                    'StopHAReplicationForUpgrade': {'properties': {'Params': {'$ref': '#/definitions/UpgradeMongoParams'},
++                                                                   'Result': {'$ref': '#/definitions/MongoUpgradeResults'}},
++                                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ControllersChangeResults)
++    async def EnableHA(self, specs):
++        '''
++        specs : typing.Sequence<+T_co>[~ControllersSpec]<~ControllersSpec>
++        Returns -> typing.Sequence<+T_co>[~ControllersChangeResult]<~ControllersChangeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='HighAvailability', request='EnableHA', version=2, params=_params)
++        _params['specs'] = specs
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ResumeHAReplicationAfterUpgrade(self, members):
++        '''
++        members : typing.Sequence<+T_co>[~Member]<~Member>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='HighAvailability', request='ResumeHAReplicationAfterUpgrade', version=2, params=_params)
++        _params['members'] = members
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MongoUpgradeResults)
++    async def StopHAReplicationForUpgrade(self, target):
++        '''
++        target : MongoVersion
++        Returns -> typing.Union[_ForwardRef('HAMember'), typing.Sequence<+T_co>[~Member]<~Member>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='HighAvailability', request='StopHAReplicationForUpgrade', version=2, params=_params)
++        _params['target'] = target
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ImageManagerFacade(Type):
++    name = 'ImageManager'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ImageFilterParams': {'additionalProperties': False,
++                                           'properties': {'images': {'items': {'$ref': '#/definitions/ImageSpec'},
++                                                                     'type': 'array'}},
++                                           'required': ['images'],
++                                           'type': 'object'},
++                     'ImageMetadata': {'additionalProperties': False,
++                                       'properties': {'arch': {'type': 'string'},
++                                                      'created': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                      'kind': {'type': 'string'},
++                                                      'series': {'type': 'string'},
++                                                      'url': {'type': 'string'}},
++                                       'required': ['kind',
++                                                    'arch',
++                                                    'series',
++                                                    'url',
++                                                    'created'],
++                                       'type': 'object'},
++                     'ImageSpec': {'additionalProperties': False,
++                                   'properties': {'arch': {'type': 'string'},
++                                                  'kind': {'type': 'string'},
++                                                  'series': {'type': 'string'}},
++                                   'required': ['kind', 'arch', 'series'],
++                                   'type': 'object'},
++                     'ListImageResult': {'additionalProperties': False,
++                                         'properties': {'result': {'items': {'$ref': '#/definitions/ImageMetadata'},
++                                                                   'type': 'array'}},
++                                         'required': ['result'],
++                                         'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'DeleteImages': {'properties': {'Params': {'$ref': '#/definitions/ImageFilterParams'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'ListImages': {'properties': {'Params': {'$ref': '#/definitions/ImageFilterParams'},
++                                                  'Result': {'$ref': '#/definitions/ListImageResult'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def DeleteImages(self, images):
++        '''
++        images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageManager', request='DeleteImages', version=2, params=_params)
++        _params['images'] = images
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListImageResult)
++    async def ListImages(self, images):
++        '''
++        images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec>
++        Returns -> typing.Sequence<+T_co>[~ImageMetadata]<~ImageMetadata>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageManager', request='ListImages', version=2, params=_params)
++        _params['images'] = images
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ImageMetadataFacade(Type):
++    name = 'ImageMetadata'
++    version = 2
++    schema =     {'definitions': {'CloudImageMetadata': {'additionalProperties': False,
++                                            'properties': {'arch': {'type': 'string'},
++                                                           'image-id': {'type': 'string'},
++                                                           'priority': {'type': 'integer'},
++                                                           'region': {'type': 'string'},
++                                                           'root-storage-size': {'type': 'integer'},
++                                                           'root-storage-type': {'type': 'string'},
++                                                           'series': {'type': 'string'},
++                                                           'source': {'type': 'string'},
++                                                           'stream': {'type': 'string'},
++                                                           'version': {'type': 'string'},
++                                                           'virt-type': {'type': 'string'}},
++                                            'required': ['image-id',
++                                                         'region',
++                                                         'version',
++                                                         'series',
++                                                         'arch',
++                                                         'source',
++                                                         'priority'],
++                                            'type': 'object'},
++                     'CloudImageMetadataList': {'additionalProperties': False,
++                                                'properties': {'metadata': {'items': {'$ref': '#/definitions/CloudImageMetadata'},
++                                                                            'type': 'array'}},
++                                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ImageMetadataFilter': {'additionalProperties': False,
++                                             'properties': {'arches': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                            'region': {'type': 'string'},
++                                                            'root-storage-type': {'type': 'string'},
++                                                            'series': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                            'stream': {'type': 'string'},
++                                                            'virt-type': {'type': 'string'}},
++                                             'type': 'object'},
++                     'ListCloudImageMetadataResult': {'additionalProperties': False,
++                                                      'properties': {'result': {'items': {'$ref': '#/definitions/CloudImageMetadata'},
++                                                                                'type': 'array'}},
++                                                      'required': ['result'],
++                                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MetadataImageIds': {'additionalProperties': False,
++                                          'properties': {'image-ids': {'items': {'type': 'string'},
++                                                                       'type': 'array'}},
++                                          'required': ['image-ids'],
++                                          'type': 'object'},
++                     'MetadataSaveParams': {'additionalProperties': False,
++                                            'properties': {'metadata': {'items': {'$ref': '#/definitions/CloudImageMetadataList'},
++                                                                        'type': 'array'}},
++                                            'type': 'object'}},
++     'properties': {'Delete': {'properties': {'Params': {'$ref': '#/definitions/MetadataImageIds'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'List': {'properties': {'Params': {'$ref': '#/definitions/ImageMetadataFilter'},
++                                            'Result': {'$ref': '#/definitions/ListCloudImageMetadataResult'}},
++                             'type': 'object'},
++                    'Save': {'properties': {'Params': {'$ref': '#/definitions/MetadataSaveParams'},
++                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                             'type': 'object'},
++                    'UpdateFromPublishedImages': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def Delete(self, image_ids):
++        '''
++        image_ids : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageMetadata', request='Delete', version=2, params=_params)
++        _params['image-ids'] = image_ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListCloudImageMetadataResult)
++    async def List(self, arches, region, root_storage_type, series, stream, virt_type):
++        '''
++        arches : typing.Sequence<+T_co>[str]
++        region : str
++        root_storage_type : str
++        series : typing.Sequence<+T_co>[str]
++        stream : str
++        virt_type : str
++        Returns -> typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageMetadata', request='List', version=2, params=_params)
++        _params['arches'] = arches
++        _params['region'] = region
++        _params['root-storage-type'] = root_storage_type
++        _params['series'] = series
++        _params['stream'] = stream
++        _params['virt-type'] = virt_type
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Save(self, metadata):
++        '''
++        metadata : typing.Sequence<+T_co>[~CloudImageMetadataList]<~CloudImageMetadataList>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageMetadata', request='Save', version=2, params=_params)
++        _params['metadata'] = metadata
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def UpdateFromPublishedImages(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ImageMetadata', request='UpdateFromPublishedImages', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class LeadershipServiceFacade(Type):
++    name = 'LeadershipService'
++    version = 2
++    schema =     {'definitions': {'ApplicationTag': {'additionalProperties': False,
++                                        'properties': {'Name': {'type': 'string'}},
++                                        'required': ['Name'],
++                                        'type': 'object'},
++                     'ClaimLeadershipBulkParams': {'additionalProperties': False,
++                                                   'properties': {'params': {'items': {'$ref': '#/definitions/ClaimLeadershipParams'},
++                                                                             'type': 'array'}},
++                                                   'required': ['params'],
++                                                   'type': 'object'},
++                     'ClaimLeadershipBulkResults': {'additionalProperties': False,
++                                                    'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                               'type': 'array'}},
++                                                    'required': ['results'],
++                                                    'type': 'object'},
++                     'ClaimLeadershipParams': {'additionalProperties': False,
++                                               'properties': {'application-tag': {'type': 'string'},
++                                                              'duration': {'type': 'number'},
++                                                              'unit-tag': {'type': 'string'}},
++                                               'required': ['application-tag',
++                                                            'unit-tag',
++                                                            'duration'],
++                                               'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'}},
++     'properties': {'BlockUntilLeadershipReleased': {'properties': {'Params': {'$ref': '#/definitions/ApplicationTag'},
++                                                                    'Result': {'$ref': '#/definitions/ErrorResult'}},
++                                                     'type': 'object'},
++                    'ClaimLeadership': {'properties': {'Params': {'$ref': '#/definitions/ClaimLeadershipBulkParams'},
++                                                       'Result': {'$ref': '#/definitions/ClaimLeadershipBulkResults'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResult)
++    async def BlockUntilLeadershipReleased(self, name):
++        '''
++        name : str
++        Returns -> Error
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LeadershipService', request='BlockUntilLeadershipReleased', version=2, params=_params)
++        _params['Name'] = name
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ClaimLeadershipBulkResults)
++    async def ClaimLeadership(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~ClaimLeadershipParams]<~ClaimLeadershipParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='LeadershipService', request='ClaimLeadership', version=2, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MachineManagerFacade(Type):
++    name = 'MachineManager'
++    version = 2
++    schema =     {'definitions': {'AddMachineParams': {'additionalProperties': False,
++                                          'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                       'type': 'array'},
++                                                         'constraints': {'$ref': '#/definitions/Value'},
++                                                         'container-type': {'type': 'string'},
++                                                         'disks': {'items': {'$ref': '#/definitions/Constraints'},
++                                                                   'type': 'array'},
++                                                         'hardware-characteristics': {'$ref': '#/definitions/HardwareCharacteristics'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'jobs': {'items': {'type': 'string'},
++                                                                  'type': 'array'},
++                                                         'nonce': {'type': 'string'},
++                                                         'parent-id': {'type': 'string'},
++                                                         'placement': {'$ref': '#/definitions/Placement'},
++                                                         'series': {'type': 'string'}},
++                                          'required': ['series',
++                                                       'constraints',
++                                                       'jobs',
++                                                       'parent-id',
++                                                       'container-type',
++                                                       'instance-id',
++                                                       'nonce',
++                                                       'hardware-characteristics',
++                                                       'addresses'],
++                                          'type': 'object'},
++                     'AddMachines': {'additionalProperties': False,
++                                     'properties': {'params': {'items': {'$ref': '#/definitions/AddMachineParams'},
++                                                               'type': 'array'}},
++                                     'required': ['params'],
++                                     'type': 'object'},
++                     'AddMachinesResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'machine': {'type': 'string'}},
++                                           'required': ['machine'],
++                                           'type': 'object'},
++                     'AddMachinesResults': {'additionalProperties': False,
++                                            'properties': {'machines': {'items': {'$ref': '#/definitions/AddMachinesResult'},
++                                                                        'type': 'array'}},
++                                            'required': ['machines'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'HardwareCharacteristics': {'additionalProperties': False,
++                                                 'properties': {'arch': {'type': 'string'},
++                                                                'availability-zone': {'type': 'string'},
++                                                                'cpu-cores': {'type': 'integer'},
++                                                                'cpu-power': {'type': 'integer'},
++                                                                'mem': {'type': 'integer'},
++                                                                'root-disk': {'type': 'integer'},
++                                                                'tags': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                                 'type': 'object'},
++                     'InstanceType': {'additionalProperties': False,
++                                      'properties': {'arches': {'items': {'type': 'string'},
++                                                                'type': 'array'},
++                                                     'cost': {'type': 'integer'},
++                                                     'cpu-cores': {'type': 'integer'},
++                                                     'deprecated': {'type': 'boolean'},
++                                                     'memory': {'type': 'integer'},
++                                                     'name': {'type': 'string'},
++                                                     'root-disk': {'type': 'integer'},
++                                                     'virt-type': {'type': 'string'}},
++                                      'required': ['arches', 'cpu-cores', 'memory'],
++                                      'type': 'object'},
++                     'InstanceTypesResult': {'additionalProperties': False,
++                                             'properties': {'cost-currency': {'type': 'string'},
++                                                            'cost-divisor': {'type': 'integer'},
++                                                            'cost-unit': {'type': 'string'},
++                                                            'error': {'$ref': '#/definitions/Error'},
++                                                            'instance-types': {'items': {'$ref': '#/definitions/InstanceType'},
++                                                                               'type': 'array'}},
++                                             'type': 'object'},
++                     'InstanceTypesResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/InstanceTypesResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelInstanceTypesConstraint': {'additionalProperties': False,
++                                                      'properties': {'value': {'$ref': '#/definitions/Value'}},
++                                                      'type': 'object'},
++                     'ModelInstanceTypesConstraints': {'additionalProperties': False,
++                                                       'properties': {'constraints': {'items': {'$ref': '#/definitions/ModelInstanceTypesConstraint'},
++                                                                                      'type': 'array'}},
++                                                       'required': ['constraints'],
++                                                       'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddMachines': {'properties': {'Params': {'$ref': '#/definitions/AddMachines'},
++                                                   'Result': {'$ref': '#/definitions/AddMachinesResults'}},
++                                    'type': 'object'},
++                    'InstanceTypes': {'properties': {'Params': {'$ref': '#/definitions/ModelInstanceTypesConstraints'},
++                                                     'Result': {'$ref': '#/definitions/InstanceTypesResults'}},
++                                      'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddMachinesResults)
++    async def AddMachines(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='AddMachines', version=2, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(InstanceTypesResults)
++    async def InstanceTypes(self, constraints):
++        '''
++        constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint>
++        Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='InstanceTypes', version=2, params=_params)
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MetricsAdderFacade(Type):
++    name = 'MetricsAdder'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Metric': {'additionalProperties': False,
++                                'properties': {'key': {'type': 'string'},
++                                               'time': {'format': 'date-time',
++                                                        'type': 'string'},
++                                               'value': {'type': 'string'}},
++                                'required': ['key', 'value', 'time'],
++                                'type': 'object'},
++                     'MetricBatch': {'additionalProperties': False,
++                                     'properties': {'charm-url': {'type': 'string'},
++                                                    'created': {'format': 'date-time',
++                                                                'type': 'string'},
++                                                    'metrics': {'items': {'$ref': '#/definitions/Metric'},
++                                                                'type': 'array'},
++                                                    'uuid': {'type': 'string'}},
++                                     'required': ['uuid',
++                                                  'charm-url',
++                                                  'created',
++                                                  'metrics'],
++                                     'type': 'object'},
++                     'MetricBatchParam': {'additionalProperties': False,
++                                          'properties': {'batch': {'$ref': '#/definitions/MetricBatch'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'batch'],
++                                          'type': 'object'},
++                     'MetricBatchParams': {'additionalProperties': False,
++                                           'properties': {'batches': {'items': {'$ref': '#/definitions/MetricBatchParam'},
++                                                                      'type': 'array'}},
++                                           'required': ['batches'],
++                                           'type': 'object'}},
++     'properties': {'AddMetricBatches': {'properties': {'Params': {'$ref': '#/definitions/MetricBatchParams'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AddMetricBatches(self, batches):
++        '''
++        batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsAdder', request='AddMetricBatches', version=2, params=_params)
++        _params['batches'] = batches
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MetricsDebugFacade(Type):
++    name = 'MetricsDebug'
++    version = 2
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityMetrics': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'metrics': {'items': {'$ref': '#/definitions/MetricResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MeterStatusParam': {'additionalProperties': False,
++                                          'properties': {'code': {'type': 'string'},
++                                                         'info': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'code', 'info'],
++                                          'type': 'object'},
++                     'MeterStatusParams': {'additionalProperties': False,
++                                           'properties': {'statues': {'items': {'$ref': '#/definitions/MeterStatusParam'},
++                                                                      'type': 'array'}},
++                                           'required': ['statues'],
++                                           'type': 'object'},
++                     'MetricResult': {'additionalProperties': False,
++                                      'properties': {'key': {'type': 'string'},
++                                                     'time': {'format': 'date-time',
++                                                              'type': 'string'},
++                                                     'unit': {'type': 'string'},
++                                                     'value': {'type': 'string'}},
++                                      'required': ['time', 'key', 'value', 'unit'],
++                                      'type': 'object'},
++                     'MetricResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/EntityMetrics'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'}},
++     'properties': {'GetMetrics': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/MetricResults'}},
++                                   'type': 'object'},
++                    'SetMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/MeterStatusParams'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(MetricResults)
++    async def GetMetrics(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~EntityMetrics]<~EntityMetrics>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsDebug', request='GetMetrics', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMeterStatus(self, statues):
++        '''
++        statues : typing.Sequence<+T_co>[~MeterStatusParam]<~MeterStatusParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MetricsDebug', request='SetMeterStatus', version=2, params=_params)
++        _params['statues'] = statues
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ModelManagerFacade(Type):
++    name = 'ModelManager'
++    version = 2
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatus': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'info': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['status', 'info', 'since'],
++                                      'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineHardware': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'availability-zone': {'type': 'string'},
++                                                        'cores': {'type': 'integer'},
++                                                        'cpu-power': {'type': 'integer'},
++                                                        'mem': {'type': 'integer'},
++                                                        'root-disk': {'type': 'integer'},
++                                                        'tags': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                         'type': 'object'},
++                     'MapResult': {'additionalProperties': False,
++                                   'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                  'result': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                          'type': 'object'}},
++                                                             'type': 'object'}},
++                                   'required': ['result'],
++                                   'type': 'object'},
++                     'MapResults': {'additionalProperties': False,
++                                    'properties': {'results': {'items': {'$ref': '#/definitions/MapResult'},
++                                                               'type': 'array'}},
++                                    'required': ['results'],
++                                    'type': 'object'},
++                     'Model': {'additionalProperties': False,
++                               'properties': {'name': {'type': 'string'},
++                                              'owner-tag': {'type': 'string'},
++                                              'uuid': {'type': 'string'}},
++                               'required': ['name', 'uuid', 'owner-tag'],
++                               'type': 'object'},
++                     'ModelCreateArgs': {'additionalProperties': False,
++                                         'properties': {'cloud-tag': {'type': 'string'},
++                                                        'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                'type': 'object'}},
++                                                                   'type': 'object'},
++                                                        'credential': {'type': 'string'},
++                                                        'name': {'type': 'string'},
++                                                        'owner-tag': {'type': 'string'},
++                                                        'region': {'type': 'string'}},
++                                         'required': ['name', 'owner-tag'],
++                                         'type': 'object'},
++                     'ModelDefaultValues': {'additionalProperties': False,
++                                            'properties': {'cloud-region': {'type': 'string'},
++                                                           'cloud-tag': {'type': 'string'},
++                                                           'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                   'type': 'object'}},
++                                                                      'type': 'object'}},
++                                            'required': ['config'],
++                                            'type': 'object'},
++                     'ModelDefaults': {'additionalProperties': False,
++                                       'properties': {'controller': {'additionalProperties': True,
++                                                                     'type': 'object'},
++                                                      'default': {'additionalProperties': True,
++                                                                  'type': 'object'},
++                                                      'regions': {'items': {'$ref': '#/definitions/RegionDefaults'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'ModelDefaultsResult': {'additionalProperties': False,
++                                             'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ModelDefaults'}},
++                                                                       'type': 'object'}},
++                                             'required': ['config'],
++                                             'type': 'object'},
++                     'ModelInfo': {'additionalProperties': False,
++                                   'properties': {'agent-version': {'$ref': '#/definitions/Number'},
++                                                  'cloud-credential-tag': {'type': 'string'},
++                                                  'cloud-region': {'type': 'string'},
++                                                  'cloud-tag': {'type': 'string'},
++                                                  'controller-uuid': {'type': 'string'},
++                                                  'default-series': {'type': 'string'},
++                                                  'life': {'type': 'string'},
++                                                  'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                               'type': 'array'},
++                                                  'migration': {'$ref': '#/definitions/ModelMigrationStatus'},
++                                                  'name': {'type': 'string'},
++                                                  'owner-tag': {'type': 'string'},
++                                                  'provider-type': {'type': 'string'},
++                                                  'sla': {'$ref': '#/definitions/ModelSLAInfo'},
++                                                  'status': {'$ref': '#/definitions/EntityStatus'},
++                                                  'users': {'items': {'$ref': '#/definitions/ModelUserInfo'},
++                                                            'type': 'array'},
++                                                  'uuid': {'type': 'string'}},
++                                   'required': ['name',
++                                                'uuid',
++                                                'controller-uuid',
++                                                'cloud-tag',
++                                                'owner-tag',
++                                                'life',
++                                                'users',
++                                                'machines',
++                                                'sla',
++                                                'agent-version'],
++                                   'type': 'object'},
++                     'ModelInfoResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'result': {'$ref': '#/definitions/ModelInfo'}},
++                                         'type': 'object'},
++                     'ModelInfoResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/ModelInfoResult'},
++                                                                     'type': 'array'}},
++                                          'required': ['results'],
++                                          'type': 'object'},
++                     'ModelMachineInfo': {'additionalProperties': False,
++                                          'properties': {'hardware': {'$ref': '#/definitions/MachineHardware'},
++                                                         'has-vote': {'type': 'boolean'},
++                                                         'id': {'type': 'string'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'wants-vote': {'type': 'boolean'}},
++                                          'required': ['id'],
++                                          'type': 'object'},
++                     'ModelMigrationStatus': {'additionalProperties': False,
++                                              'properties': {'end': {'format': 'date-time',
++                                                                     'type': 'string'},
++                                                             'start': {'format': 'date-time',
++                                                                       'type': 'string'},
++                                                             'status': {'type': 'string'}},
++                                              'required': ['status', 'start'],
++                                              'type': 'object'},
++                     'ModelSLAInfo': {'additionalProperties': False,
++                                      'properties': {'level': {'type': 'string'},
++                                                     'owner': {'type': 'string'}},
++                                      'required': ['level', 'owner'],
++                                      'type': 'object'},
++                     'ModelStatus': {'additionalProperties': False,
++                                     'properties': {'application-count': {'type': 'integer'},
++                                                    'hosted-machine-count': {'type': 'integer'},
++                                                    'life': {'type': 'string'},
++                                                    'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                                 'type': 'array'},
++                                                    'model-tag': {'type': 'string'},
++                                                    'owner-tag': {'type': 'string'}},
++                                     'required': ['model-tag',
++                                                  'life',
++                                                  'hosted-machine-count',
++                                                  'application-count',
++                                                  'owner-tag'],
++                                     'type': 'object'},
++                     'ModelStatusResults': {'additionalProperties': False,
++                                            'properties': {'models': {'items': {'$ref': '#/definitions/ModelStatus'},
++                                                                      'type': 'array'}},
++                                            'required': ['models'],
++                                            'type': 'object'},
++                     'ModelUnsetKeys': {'additionalProperties': False,
++                                        'properties': {'cloud-region': {'type': 'string'},
++                                                       'cloud-tag': {'type': 'string'},
++                                                       'keys': {'items': {'type': 'string'},
++                                                                'type': 'array'}},
++                                        'required': ['keys'],
++                                        'type': 'object'},
++                     'ModelUserInfo': {'additionalProperties': False,
++                                       'properties': {'access': {'type': 'string'},
++                                                      'display-name': {'type': 'string'},
++                                                      'last-connection': {'format': 'date-time',
++                                                                          'type': 'string'},
++                                                      'user': {'type': 'string'}},
++                                       'required': ['user',
++                                                    'display-name',
++                                                    'last-connection',
++                                                    'access'],
++                                       'type': 'object'},
++                     'ModifyModelAccess': {'additionalProperties': False,
++                                           'properties': {'access': {'type': 'string'},
++                                                          'action': {'type': 'string'},
++                                                          'model-tag': {'type': 'string'},
++                                                          'user-tag': {'type': 'string'}},
++                                           'required': ['user-tag',
++                                                        'action',
++                                                        'access',
++                                                        'model-tag'],
++                                           'type': 'object'},
++                     'ModifyModelAccessRequest': {'additionalProperties': False,
++                                                  'properties': {'changes': {'items': {'$ref': '#/definitions/ModifyModelAccess'},
++                                                                             'type': 'array'}},
++                                                  'required': ['changes'],
++                                                  'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'RegionDefaults': {'additionalProperties': False,
++                                        'properties': {'region-name': {'type': 'string'},
++                                                       'value': {'additionalProperties': True,
++                                                                 'type': 'object'}},
++                                        'required': ['region-name', 'value'],
++                                        'type': 'object'},
++                     'SetModelDefaults': {'additionalProperties': False,
++                                          'properties': {'config': {'items': {'$ref': '#/definitions/ModelDefaultValues'},
++                                                                    'type': 'array'}},
++                                          'required': ['config'],
++                                          'type': 'object'},
++                     'UnsetModelDefaults': {'additionalProperties': False,
++                                            'properties': {'keys': {'items': {'$ref': '#/definitions/ModelUnsetKeys'},
++                                                                    'type': 'array'}},
++                                            'required': ['keys'],
++                                            'type': 'object'},
++                     'UserModel': {'additionalProperties': False,
++                                   'properties': {'last-connection': {'format': 'date-time',
++                                                                      'type': 'string'},
++                                                  'model': {'$ref': '#/definitions/Model'}},
++                                   'required': ['model', 'last-connection'],
++                                   'type': 'object'},
++                     'UserModelList': {'additionalProperties': False,
++                                       'properties': {'user-models': {'items': {'$ref': '#/definitions/UserModel'},
++                                                                      'type': 'array'}},
++                                       'required': ['user-models'],
++                                       'type': 'object'}},
++     'properties': {'CreateModel': {'properties': {'Params': {'$ref': '#/definitions/ModelCreateArgs'},
++                                                   'Result': {'$ref': '#/definitions/ModelInfo'}},
++                                    'type': 'object'},
++                    'DestroyModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'DumpModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/MapResults'}},
++                                   'type': 'object'},
++                    'DumpModelsDB': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/MapResults'}},
++                                     'type': 'object'},
++                    'ListModels': {'properties': {'Params': {'$ref': '#/definitions/Entity'},
++                                                  'Result': {'$ref': '#/definitions/UserModelList'}},
++                                   'type': 'object'},
++                    'ModelDefaults': {'properties': {'Result': {'$ref': '#/definitions/ModelDefaultsResult'}},
++                                      'type': 'object'},
++                    'ModelInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                 'Result': {'$ref': '#/definitions/ModelInfoResults'}},
++                                  'type': 'object'},
++                    'ModelStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ModelStatusResults'}},
++                                    'type': 'object'},
++                    'ModifyModelAccess': {'properties': {'Params': {'$ref': '#/definitions/ModifyModelAccessRequest'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SetModelDefaults': {'properties': {'Params': {'$ref': '#/definitions/SetModelDefaults'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'},
++                    'UnsetModelDefaults': {'properties': {'Params': {'$ref': '#/definitions/UnsetModelDefaults'},
++                                                          'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ModelInfo)
++    async def CreateModel(self, cloud_tag, config, credential, name, owner_tag, region):
++        '''
++        cloud_tag : str
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        credential : str
++        name : str
++        owner_tag : str
++        region : str
++        Returns -> typing.Union[_ForwardRef('Number'), _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='CreateModel', version=2, params=_params)
++        _params['cloud-tag'] = cloud_tag
++        _params['config'] = config
++        _params['credential'] = credential
++        _params['name'] = name
++        _params['owner-tag'] = owner_tag
++        _params['region'] = region
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyModels(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DestroyModels', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MapResults)
++    async def DumpModels(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DumpModels', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MapResults)
++    async def DumpModelsDB(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DumpModelsDB', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UserModelList)
++    async def ListModels(self, tag):
++        '''
++        tag : str
++        Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ListModels', version=2, params=_params)
++        _params['tag'] = tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelDefaultsResult)
++    async def ModelDefaults(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelDefaults', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelInfoResults)
++    async def ModelInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelInfo', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelStatusResults)
++    async def ModelStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelStatus', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ModifyModelAccess(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModifyModelAccess', version=2, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetModelDefaults(self, config):
++        '''
++        config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='SetModelDefaults', version=2, params=_params)
++        _params['config'] = config
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UnsetModelDefaults(self, keys):
++        '''
++        keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='UnsetModelDefaults', version=2, params=_params)
++        _params['keys'] = keys
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class RebootFacade(Type):
++    name = 'Reboot'
++    version = 2
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'RebootActionResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'result': {'type': 'string'}},
++                                            'type': 'object'},
++                     'RebootActionResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/RebootActionResult'},
++                                                                        'type': 'array'}},
++                                             'type': 'object'}},
++     'properties': {'ClearReboot': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'GetRebootAction': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/RebootActionResults'}},
++                                        'type': 'object'},
++                    'RequestReboot': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'WatchForRebootEvent': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                            'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def ClearReboot(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Reboot', request='ClearReboot', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RebootActionResults)
++    async def GetRebootAction(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~RebootActionResult]<~RebootActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Reboot', request='GetRebootAction', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RequestReboot(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Reboot', request='RequestReboot', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForRebootEvent(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Reboot', request='WatchForRebootEvent', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ResumerFacade(Type):
++    name = 'Resumer'
++    version = 2
++    schema =     {'properties': {'ResumeTransactions': {'type': 'object'}}, 'type': 'object'}
++    
++
++    @ReturnMapping(None)
++    async def ResumeTransactions(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Resumer', request='ResumeTransactions', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SSHClientFacade(Type):
++    name = 'SSHClient'
++    version = 2
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SSHAddressResult': {'additionalProperties': False,
++                                          'properties': {'address': {'type': 'string'},
++                                                         'error': {'$ref': '#/definitions/Error'}},
++                                          'type': 'object'},
++                     'SSHAddressResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/SSHAddressResult'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'SSHAddressesResult': {'additionalProperties': False,
++                                            'properties': {'addresses': {'items': {'type': 'string'},
++                                                                         'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'}},
++                                            'required': ['addresses'],
++                                            'type': 'object'},
++                     'SSHAddressesResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/SSHAddressesResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'SSHProxyResult': {'additionalProperties': False,
++                                        'properties': {'use-proxy': {'type': 'boolean'}},
++                                        'required': ['use-proxy'],
++                                        'type': 'object'},
++                     'SSHPublicKeysResult': {'additionalProperties': False,
++                                             'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                            'public-keys': {'items': {'type': 'string'},
++                                                                            'type': 'array'}},
++                                             'type': 'object'},
++                     'SSHPublicKeysResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/SSHPublicKeysResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'}},
++     'properties': {'AllAddresses': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/SSHAddressesResults'}},
++                                     'type': 'object'},
++                    'PrivateAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/SSHAddressResults'}},
++                                       'type': 'object'},
++                    'Proxy': {'properties': {'Result': {'$ref': '#/definitions/SSHProxyResult'}},
++                              'type': 'object'},
++                    'PublicAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/SSHAddressResults'}},
++                                      'type': 'object'},
++                    'PublicKeys': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/SSHPublicKeysResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(SSHAddressesResults)
++    async def AllAddresses(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHAddressesResult]<~SSHAddressesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='AllAddresses', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHAddressResults)
++    async def PrivateAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PrivateAddress', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHProxyResult)
++    async def Proxy(self):
++        '''
++
++        Returns -> bool
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='Proxy', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHAddressResults)
++    async def PublicAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PublicAddress', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SSHPublicKeysResults)
++    async def PublicKeys(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='SSHClient', request='PublicKeys', version=2, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SpacesFacade(Type):
++    name = 'Spaces'
++    version = 2
++    schema =     {'definitions': {'CreateSpaceParams': {'additionalProperties': False,
++                                           'properties': {'provider-id': {'type': 'string'},
++                                                          'public': {'type': 'boolean'},
++                                                          'space-tag': {'type': 'string'},
++                                                          'subnet-tags': {'items': {'type': 'string'},
++                                                                          'type': 'array'}},
++                                           'required': ['subnet-tags',
++                                                        'space-tag',
++                                                        'public'],
++                                           'type': 'object'},
++                     'CreateSpacesParams': {'additionalProperties': False,
++                                            'properties': {'spaces': {'items': {'$ref': '#/definitions/CreateSpaceParams'},
++                                                                      'type': 'array'}},
++                                            'required': ['spaces'],
++                                            'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ListSpacesResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/Space'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Space': {'additionalProperties': False,
++                               'properties': {'error': {'$ref': '#/definitions/Error'},
++                                              'name': {'type': 'string'},
++                                              'subnets': {'items': {'$ref': '#/definitions/Subnet'},
++                                                          'type': 'array'}},
++                               'required': ['name', 'subnets'],
++                               'type': 'object'},
++                     'Subnet': {'additionalProperties': False,
++                                'properties': {'cidr': {'type': 'string'},
++                                               'life': {'type': 'string'},
++                                               'provider-id': {'type': 'string'},
++                                               'provider-network-id': {'type': 'string'},
++                                               'provider-space-id': {'type': 'string'},
++                                               'space-tag': {'type': 'string'},
++                                               'status': {'type': 'string'},
++                                               'vlan-tag': {'type': 'integer'},
++                                               'zones': {'items': {'type': 'string'},
++                                                         'type': 'array'}},
++                                'required': ['cidr',
++                                             'vlan-tag',
++                                             'life',
++                                             'space-tag',
++                                             'zones'],
++                                'type': 'object'}},
++     'properties': {'CreateSpaces': {'properties': {'Params': {'$ref': '#/definitions/CreateSpacesParams'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'ListSpaces': {'properties': {'Result': {'$ref': '#/definitions/ListSpacesResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def CreateSpaces(self, spaces):
++        '''
++        spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Spaces', request='CreateSpaces', version=2, params=_params)
++        _params['spaces'] = spaces
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListSpacesResults)
++    async def ListSpaces(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~Space]<~Space>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Spaces', request='ListSpaces', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class StatusHistoryFacade(Type):
++    name = 'StatusHistory'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'StatusHistoryPruneArgs': {'additionalProperties': False,
++                                                'properties': {'max-history-mb': {'type': 'integer'},
++                                                               'max-history-time': {'type': 'integer'}},
++                                                'required': ['max-history-time',
++                                                             'max-history-mb'],
++                                                'type': 'object'}},
++     'properties': {'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'Prune': {'properties': {'Params': {'$ref': '#/definitions/StatusHistoryPruneArgs'}},
++                              'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StatusHistory', request='ModelConfig', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Prune(self, max_history_mb, max_history_time):
++        '''
++        max_history_mb : int
++        max_history_time : int
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StatusHistory', request='Prune', version=2, params=_params)
++        _params['max-history-mb'] = max_history_mb
++        _params['max-history-time'] = max_history_time
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StatusHistory', request='WatchForModelConfigChanges', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SubnetsFacade(Type):
++    name = 'Subnets'
++    version = 2
++    schema =     {'definitions': {'AddSubnetParams': {'additionalProperties': False,
++                                         'properties': {'provider-network-id': {'type': 'string'},
++                                                        'space-tag': {'type': 'string'},
++                                                        'subnet-provider-id': {'type': 'string'},
++                                                        'subnet-tag': {'type': 'string'},
++                                                        'vlan-tag': {'type': 'integer'},
++                                                        'zones': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                         'required': ['space-tag'],
++                                         'type': 'object'},
++                     'AddSubnetsParams': {'additionalProperties': False,
++                                          'properties': {'subnets': {'items': {'$ref': '#/definitions/AddSubnetParams'},
++                                                                     'type': 'array'}},
++                                          'required': ['subnets'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ListSubnetsResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/Subnet'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'SpaceResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                    'tag': {'type': 'string'}},
++                                     'required': ['tag'],
++                                     'type': 'object'},
++                     'SpaceResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/SpaceResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Subnet': {'additionalProperties': False,
++                                'properties': {'cidr': {'type': 'string'},
++                                               'life': {'type': 'string'},
++                                               'provider-id': {'type': 'string'},
++                                               'provider-network-id': {'type': 'string'},
++                                               'provider-space-id': {'type': 'string'},
++                                               'space-tag': {'type': 'string'},
++                                               'status': {'type': 'string'},
++                                               'vlan-tag': {'type': 'integer'},
++                                               'zones': {'items': {'type': 'string'},
++                                                         'type': 'array'}},
++                                'required': ['cidr',
++                                             'vlan-tag',
++                                             'life',
++                                             'space-tag',
++                                             'zones'],
++                                'type': 'object'},
++                     'SubnetsFilters': {'additionalProperties': False,
++                                        'properties': {'space-tag': {'type': 'string'},
++                                                       'zone': {'type': 'string'}},
++                                        'type': 'object'},
++                     'ZoneResult': {'additionalProperties': False,
++                                    'properties': {'available': {'type': 'boolean'},
++                                                   'error': {'$ref': '#/definitions/Error'},
++                                                   'name': {'type': 'string'}},
++                                    'required': ['name', 'available'],
++                                    'type': 'object'},
++                     'ZoneResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/ZoneResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'}},
++     'properties': {'AddSubnets': {'properties': {'Params': {'$ref': '#/definitions/AddSubnetsParams'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'AllSpaces': {'properties': {'Result': {'$ref': '#/definitions/SpaceResults'}},
++                                  'type': 'object'},
++                    'AllZones': {'properties': {'Result': {'$ref': '#/definitions/ZoneResults'}},
++                                 'type': 'object'},
++                    'ListSubnets': {'properties': {'Params': {'$ref': '#/definitions/SubnetsFilters'},
++                                                   'Result': {'$ref': '#/definitions/ListSubnetsResults'}},
++                                    'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AddSubnets(self, subnets):
++        '''
++        subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Subnets', request='AddSubnets', version=2, params=_params)
++        _params['subnets'] = subnets
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SpaceResults)
++    async def AllSpaces(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~SpaceResult]<~SpaceResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Subnets', request='AllSpaces', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ZoneResults)
++    async def AllZones(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~ZoneResult]<~ZoneResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Subnets', request='AllZones', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListSubnetsResults)
++    async def ListSubnets(self, space_tag, zone):
++        '''
++        space_tag : str
++        zone : str
++        Returns -> typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Subnets', request='ListSubnets', version=2, params=_params)
++        _params['space-tag'] = space_tag
++        _params['zone'] = zone
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class VolumeAttachmentsWatcherFacade(Type):
++    name = 'VolumeAttachmentsWatcher'
++    version = 2
++    schema =     {'definitions': {'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineStorageId': {'additionalProperties': False,
++                                          'properties': {'attachment-tag': {'type': 'string'},
++                                                         'machine-tag': {'type': 'string'}},
++                                          'required': ['machine-tag',
++                                                       'attachment-tag'],
++                                          'type': 'object'},
++                     'MachineStorageIdsWatchResult': {'additionalProperties': False,
++                                                      'properties': {'changes': {'items': {'$ref': '#/definitions/MachineStorageId'},
++                                                                                 'type': 'array'},
++                                                                     'error': {'$ref': '#/definitions/Error'},
++                                                                     'watcher-id': {'type': 'string'}},
++                                                      'required': ['watcher-id',
++                                                                   'changes'],
++                                                      'type': 'object'}},
++     'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/MachineStorageIdsWatchResult'}},
++                             'type': 'object'},
++                    'Stop': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(MachineStorageIdsWatchResult)
++    async def Next(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='VolumeAttachmentsWatcher', request='Next', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Stop(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='VolumeAttachmentsWatcher', request='Stop', version=2, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
index 0000000,0000000..3f9ef55
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5220 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++from juju.client._definitions import *
++
++
++class ApplicationFacade(Type):
++    name = 'Application'
++    version = 3
++    schema =     {'definitions': {'AddApplicationUnits': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'num-units': {'type': 'integer'},
++                                                            'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                          'type': 'array'}},
++                                             'required': ['application',
++                                                          'num-units',
++                                                          'placement'],
++                                             'type': 'object'},
++                     'AddApplicationUnitsResults': {'additionalProperties': False,
++                                                    'properties': {'units': {'items': {'type': 'string'},
++                                                                             'type': 'array'}},
++                                                    'required': ['units'],
++                                                    'type': 'object'},
++                     'AddRelation': {'additionalProperties': False,
++                                     'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                     'required': ['endpoints'],
++                                     'type': 'object'},
++                     'AddRelationResults': {'additionalProperties': False,
++                                            'properties': {'endpoints': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                                         'type': 'object'}},
++                                            'required': ['endpoints'],
++                                            'type': 'object'},
++                     'ApplicationCharmRelations': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'ApplicationCharmRelationsResults': {'additionalProperties': False,
++                                                          'properties': {'charm-relations': {'items': {'type': 'string'},
++                                                                                             'type': 'array'}},
++                                                          'required': ['charm-relations'],
++                                                          'type': 'object'},
++                     'ApplicationDeploy': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'channel': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'config': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                     'type': 'object'},
++                                                          'config-yaml': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                          'num-units': {'type': 'integer'},
++                                                          'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                        'type': 'array'},
++                                                          'resources': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                        'type': 'object'},
++                                                          'series': {'type': 'string'},
++                                                          'storage': {'patternProperties': {'.*': {'$ref': '#/definitions/Constraints'}},
++                                                                      'type': 'object'}},
++                                           'required': ['application',
++                                                        'series',
++                                                        'charm-url',
++                                                        'channel',
++                                                        'num-units',
++                                                        'config-yaml',
++                                                        'constraints'],
++                                           'type': 'object'},
++                     'ApplicationDestroy': {'additionalProperties': False,
++                                            'properties': {'application': {'type': 'string'}},
++                                            'required': ['application'],
++                                            'type': 'object'},
++                     'ApplicationExpose': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'}},
++                                           'required': ['application'],
++                                           'type': 'object'},
++                     'ApplicationGet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'}},
++                                        'required': ['application'],
++                                        'type': 'object'},
++                     'ApplicationGetResults': {'additionalProperties': False,
++                                               'properties': {'application': {'type': 'string'},
++                                                              'charm': {'type': 'string'},
++                                                              'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                      'type': 'object'}},
++                                                                         'type': 'object'},
++                                                              'constraints': {'$ref': '#/definitions/Value'},
++                                                              'series': {'type': 'string'}},
++                                               'required': ['application',
++                                                            'charm',
++                                                            'config',
++                                                            'constraints',
++                                                            'series'],
++                                               'type': 'object'},
++                     'ApplicationMetricCredential': {'additionalProperties': False,
++                                                     'properties': {'application': {'type': 'string'},
++                                                                    'metrics-credentials': {'items': {'type': 'integer'},
++                                                                                            'type': 'array'}},
++                                                     'required': ['application',
++                                                                  'metrics-credentials'],
++                                                     'type': 'object'},
++                     'ApplicationMetricCredentials': {'additionalProperties': False,
++                                                      'properties': {'creds': {'items': {'$ref': '#/definitions/ApplicationMetricCredential'},
++                                                                               'type': 'array'}},
++                                                      'required': ['creds'],
++                                                      'type': 'object'},
++                     'ApplicationSet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'options': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                   'type': 'object'}},
++                                        'required': ['application', 'options'],
++                                        'type': 'object'},
++                     'ApplicationSetCharm': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'channel': {'type': 'string'},
++                                                            'charm-url': {'type': 'string'},
++                                                            'config-settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                            'config-settings-yaml': {'type': 'string'},
++                                                            'force-series': {'type': 'boolean'},
++                                                            'force-units': {'type': 'boolean'},
++                                                            'resource-ids': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                             'type': 'object'},
++                                                            'storage-constraints': {'patternProperties': {'.*': {'$ref': '#/definitions/StorageConstraints'}},
++                                                                                    'type': 'object'}},
++                                             'required': ['application',
++                                                          'charm-url',
++                                                          'channel',
++                                                          'force-units',
++                                                          'force-series'],
++                                             'type': 'object'},
++                     'ApplicationUnexpose': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'}},
++                                             'required': ['application'],
++                                             'type': 'object'},
++                     'ApplicationUnset': {'additionalProperties': False,
++                                          'properties': {'application': {'type': 'string'},
++                                                         'options': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                          'required': ['application', 'options'],
++                                          'type': 'object'},
++                     'ApplicationUpdate': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'force-charm-url': {'type': 'boolean'},
++                                                          'force-series': {'type': 'boolean'},
++                                                          'min-units': {'type': 'integer'},
++                                                          'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                       'type': 'object'},
++                                                          'settings-yaml': {'type': 'string'}},
++                                           'required': ['application',
++                                                        'charm-url',
++                                                        'force-charm-url',
++                                                        'force-series',
++                                                        'settings-yaml'],
++                                           'type': 'object'},
++                     'ApplicationsDeploy': {'additionalProperties': False,
++                                            'properties': {'applications': {'items': {'$ref': '#/definitions/ApplicationDeploy'},
++                                                                            'type': 'array'}},
++                                            'required': ['applications'],
++                                            'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'DestroyApplicationUnits': {'additionalProperties': False,
++                                                 'properties': {'unit-names': {'items': {'type': 'string'},
++                                                                               'type': 'array'}},
++                                                 'required': ['unit-names'],
++                                                 'type': 'object'},
++                     'DestroyRelation': {'additionalProperties': False,
++                                         'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                      'type': 'array'}},
++                                         'required': ['endpoints'],
++                                         'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetApplicationConstraints': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'GetConstraintsResults': {'additionalProperties': False,
++                                               'properties': {'constraints': {'$ref': '#/definitions/Value'}},
++                                               'required': ['constraints'],
++                                               'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'SetConstraints': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'constraints': {'$ref': '#/definitions/Value'}},
++                                        'required': ['application', 'constraints'],
++                                        'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddRelation': {'properties': {'Params': {'$ref': '#/definitions/AddRelation'},
++                                                   'Result': {'$ref': '#/definitions/AddRelationResults'}},
++                                    'type': 'object'},
++                    'AddUnits': {'properties': {'Params': {'$ref': '#/definitions/AddApplicationUnits'},
++                                                'Result': {'$ref': '#/definitions/AddApplicationUnitsResults'}},
++                                 'type': 'object'},
++                    'CharmRelations': {'properties': {'Params': {'$ref': '#/definitions/ApplicationCharmRelations'},
++                                                      'Result': {'$ref': '#/definitions/ApplicationCharmRelationsResults'}},
++                                       'type': 'object'},
++                    'Deploy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationsDeploy'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationDestroy'}},
++                                'type': 'object'},
++                    'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}},
++                                        'type': 'object'},
++                    'DestroyUnits': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationUnits'}},
++                                     'type': 'object'},
++                    'Expose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationExpose'}},
++                               'type': 'object'},
++                    'Get': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                           'Result': {'$ref': '#/definitions/ApplicationGetResults'}},
++                            'type': 'object'},
++                    'GetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                                   'Result': {'$ref': '#/definitions/StringResult'}},
++                                    'type': 'object'},
++                    'GetConstraints': {'properties': {'Params': {'$ref': '#/definitions/GetApplicationConstraints'},
++                                                      'Result': {'$ref': '#/definitions/GetConstraintsResults'}},
++                                       'type': 'object'},
++                    'Set': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSet'}},
++                            'type': 'object'},
++                    'SetCharm': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharm'}},
++                                 'type': 'object'},
++                    'SetConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}},
++                                       'type': 'object'},
++                    'SetMetricCredentials': {'properties': {'Params': {'$ref': '#/definitions/ApplicationMetricCredentials'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'Unexpose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnexpose'}},
++                                 'type': 'object'},
++                    'Unset': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnset'}},
++                              'type': 'object'},
++                    'Update': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUpdate'}},
++                               'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddRelationResults)
++    async def AddRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddRelation', version=3, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddApplicationUnitsResults)
++    async def AddUnits(self, application, num_units, placement):
++        '''
++        application : str
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddUnits', version=3, params=_params)
++        _params['application'] = application
++        _params['num-units'] = num_units
++        _params['placement'] = placement
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationCharmRelationsResults)
++    async def CharmRelations(self, application):
++        '''
++        application : str
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='CharmRelations', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Deploy(self, applications):
++        '''
++        applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Deploy', version=3, params=_params)
++        _params['applications'] = applications
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Destroy(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Destroy', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyRelation', version=3, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyUnits(self, unit_names):
++        '''
++        unit_names : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnits', version=3, params=_params)
++        _params['unit-names'] = unit_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Expose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Expose', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationGetResults)
++    async def Get(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Get', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def GetCharmURL(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetCharmURL', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetConstraintsResults)
++    async def GetConstraints(self, application):
++        '''
++        application : str
++        Returns -> Value
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetConstraints', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Set(self, application, options):
++        '''
++        application : str
++        options : typing.Mapping<~KT, +VT_co>[str, str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Set', version=3, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetCharm(self, application, channel, charm_url, config_settings, config_settings_yaml, force_series, force_units, resource_ids, storage_constraints):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config_settings : typing.Mapping<~KT, +VT_co>[str, str]
++        config_settings_yaml : str
++        force_series : bool
++        force_units : bool
++        resource_ids : typing.Mapping<~KT, +VT_co>[str, str]
++        storage_constraints : typing.Mapping<~KT, +VT_co>[str, ~StorageConstraints]<~StorageConstraints>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetCharm', version=3, params=_params)
++        _params['application'] = application
++        _params['channel'] = channel
++        _params['charm-url'] = charm_url
++        _params['config-settings'] = config_settings
++        _params['config-settings-yaml'] = config_settings_yaml
++        _params['force-series'] = force_series
++        _params['force-units'] = force_units
++        _params['resource-ids'] = resource_ids
++        _params['storage-constraints'] = storage_constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetConstraints(self, application, constraints):
++        '''
++        application : str
++        constraints : Value
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetConstraints', version=3, params=_params)
++        _params['application'] = application
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMetricCredentials(self, creds):
++        '''
++        creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetMetricCredentials', version=3, params=_params)
++        _params['creds'] = creds
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unexpose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unexpose', version=3, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unset(self, application, options):
++        '''
++        application : str
++        options : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unset', version=3, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Update(self, application, charm_url, constraints, force_charm_url, force_series, min_units, settings, settings_yaml):
++        '''
++        application : str
++        charm_url : str
++        constraints : Value
++        force_charm_url : bool
++        force_series : bool
++        min_units : int
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        settings_yaml : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Update', version=3, params=_params)
++        _params['application'] = application
++        _params['charm-url'] = charm_url
++        _params['constraints'] = constraints
++        _params['force-charm-url'] = force_charm_url
++        _params['force-series'] = force_series
++        _params['min-units'] = min_units
++        _params['settings'] = settings
++        _params['settings-yaml'] = settings_yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ControllerFacade(Type):
++    name = 'Controller'
++    version = 3
++    schema =     {'definitions': {'AllWatcherId': {'additionalProperties': False,
++                                      'properties': {'watcher-id': {'type': 'string'}},
++                                      'required': ['watcher-id'],
++                                      'type': 'object'},
++                     'CloudCredential': {'additionalProperties': False,
++                                         'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                        'auth-type': {'type': 'string'},
++                                                        'redacted': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                         'required': ['auth-type'],
++                                         'type': 'object'},
++                     'CloudSpec': {'additionalProperties': False,
++                                   'properties': {'credential': {'$ref': '#/definitions/CloudCredential'},
++                                                  'endpoint': {'type': 'string'},
++                                                  'identity-endpoint': {'type': 'string'},
++                                                  'name': {'type': 'string'},
++                                                  'region': {'type': 'string'},
++                                                  'storage-endpoint': {'type': 'string'},
++                                                  'type': {'type': 'string'}},
++                                   'required': ['type', 'name'],
++                                   'type': 'object'},
++                     'CloudSpecResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'result': {'$ref': '#/definitions/CloudSpec'}},
++                                         'type': 'object'},
++                     'CloudSpecResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/CloudSpecResult'},
++                                                                     'type': 'array'}},
++                                          'type': 'object'},
++                     'ConfigValue': {'additionalProperties': False,
++                                     'properties': {'source': {'type': 'string'},
++                                                    'value': {'additionalProperties': True,
++                                                              'type': 'object'}},
++                                     'required': ['value', 'source'],
++                                     'type': 'object'},
++                     'ControllerConfigResult': {'additionalProperties': False,
++                                                'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'}},
++                                                'required': ['config'],
++                                                'type': 'object'},
++                     'DestroyControllerArgs': {'additionalProperties': False,
++                                               'properties': {'destroy-models': {'type': 'boolean'}},
++                                               'required': ['destroy-models'],
++                                               'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'HostedModelConfig': {'additionalProperties': False,
++                                           'properties': {'cloud-spec': {'$ref': '#/definitions/CloudSpec'},
++                                                          'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'name': {'type': 'string'},
++                                                          'owner': {'type': 'string'}},
++                                           'required': ['name', 'owner'],
++                                           'type': 'object'},
++                     'HostedModelConfigsResults': {'additionalProperties': False,
++                                                   'properties': {'models': {'items': {'$ref': '#/definitions/HostedModelConfig'},
++                                                                             'type': 'array'}},
++                                                   'required': ['models'],
++                                                   'type': 'object'},
++                     'InitiateMigrationArgs': {'additionalProperties': False,
++                                               'properties': {'specs': {'items': {'$ref': '#/definitions/MigrationSpec'},
++                                                                        'type': 'array'}},
++                                               'required': ['specs'],
++                                               'type': 'object'},
++                     'InitiateMigrationResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'migration-id': {'type': 'string'},
++                                                                'model-tag': {'type': 'string'}},
++                                                 'required': ['model-tag',
++                                                              'migration-id'],
++                                                 'type': 'object'},
++                     'InitiateMigrationResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/InitiateMigrationResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineHardware': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'availability-zone': {'type': 'string'},
++                                                        'cores': {'type': 'integer'},
++                                                        'cpu-power': {'type': 'integer'},
++                                                        'mem': {'type': 'integer'},
++                                                        'root-disk': {'type': 'integer'},
++                                                        'tags': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                         'type': 'object'},
++                     'MigrationSpec': {'additionalProperties': False,
++                                       'properties': {'model-tag': {'type': 'string'},
++                                                      'target-info': {'$ref': '#/definitions/MigrationTargetInfo'}},
++                                       'required': ['model-tag', 'target-info'],
++                                       'type': 'object'},
++                     'MigrationTargetInfo': {'additionalProperties': False,
++                                             'properties': {'addrs': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                            'auth-tag': {'type': 'string'},
++                                                            'ca-cert': {'type': 'string'},
++                                                            'controller-tag': {'type': 'string'},
++                                                            'macaroons': {'type': 'string'},
++                                                            'password': {'type': 'string'}},
++                                             'required': ['controller-tag',
++                                                          'addrs',
++                                                          'ca-cert',
++                                                          'auth-tag'],
++                                             'type': 'object'},
++                     'Model': {'additionalProperties': False,
++                               'properties': {'name': {'type': 'string'},
++                                              'owner-tag': {'type': 'string'},
++                                              'uuid': {'type': 'string'}},
++                               'required': ['name', 'uuid', 'owner-tag'],
++                               'type': 'object'},
++                     'ModelBlockInfo': {'additionalProperties': False,
++                                        'properties': {'blocks': {'items': {'type': 'string'},
++                                                                  'type': 'array'},
++                                                       'model-uuid': {'type': 'string'},
++                                                       'name': {'type': 'string'},
++                                                       'owner-tag': {'type': 'string'}},
++                                        'required': ['name',
++                                                     'model-uuid',
++                                                     'owner-tag',
++                                                     'blocks'],
++                                        'type': 'object'},
++                     'ModelBlockInfoList': {'additionalProperties': False,
++                                            'properties': {'models': {'items': {'$ref': '#/definitions/ModelBlockInfo'},
++                                                                      'type': 'array'}},
++                                            'type': 'object'},
++                     'ModelConfigResults': {'additionalProperties': False,
++                                            'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ConfigValue'}},
++                                                                      'type': 'object'}},
++                                            'required': ['config'],
++                                            'type': 'object'},
++                     'ModelMachineInfo': {'additionalProperties': False,
++                                          'properties': {'hardware': {'$ref': '#/definitions/MachineHardware'},
++                                                         'has-vote': {'type': 'boolean'},
++                                                         'id': {'type': 'string'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'wants-vote': {'type': 'boolean'}},
++                                          'required': ['id'],
++                                          'type': 'object'},
++                     'ModelStatus': {'additionalProperties': False,
++                                     'properties': {'application-count': {'type': 'integer'},
++                                                    'hosted-machine-count': {'type': 'integer'},
++                                                    'life': {'type': 'string'},
++                                                    'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                                 'type': 'array'},
++                                                    'model-tag': {'type': 'string'},
++                                                    'owner-tag': {'type': 'string'}},
++                                     'required': ['model-tag',
++                                                  'life',
++                                                  'hosted-machine-count',
++                                                  'application-count',
++                                                  'owner-tag'],
++                                     'type': 'object'},
++                     'ModelStatusResults': {'additionalProperties': False,
++                                            'properties': {'models': {'items': {'$ref': '#/definitions/ModelStatus'},
++                                                                      'type': 'array'}},
++                                            'required': ['models'],
++                                            'type': 'object'},
++                     'ModelTag': {'additionalProperties': False, 'type': 'object'},
++                     'ModifyControllerAccess': {'additionalProperties': False,
++                                                'properties': {'access': {'type': 'string'},
++                                                               'action': {'type': 'string'},
++                                                               'user-tag': {'type': 'string'}},
++                                                'required': ['user-tag',
++                                                             'action',
++                                                             'access'],
++                                                'type': 'object'},
++                     'ModifyControllerAccessRequest': {'additionalProperties': False,
++                                                       'properties': {'changes': {'items': {'$ref': '#/definitions/ModifyControllerAccess'},
++                                                                                  'type': 'array'}},
++                                                       'required': ['changes'],
++                                                       'type': 'object'},
++                     'RemoveBlocksArgs': {'additionalProperties': False,
++                                          'properties': {'all': {'type': 'boolean'}},
++                                          'required': ['all'],
++                                          'type': 'object'},
++                     'UserAccess': {'additionalProperties': False,
++                                    'properties': {'access': {'type': 'string'},
++                                                   'user-tag': {'type': 'string'}},
++                                    'required': ['user-tag', 'access'],
++                                    'type': 'object'},
++                     'UserAccessResult': {'additionalProperties': False,
++                                          'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                         'result': {'$ref': '#/definitions/UserAccess'}},
++                                          'type': 'object'},
++                     'UserAccessResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/UserAccessResult'},
++                                                                      'type': 'array'}},
++                                           'type': 'object'},
++                     'UserModel': {'additionalProperties': False,
++                                   'properties': {'last-connection': {'format': 'date-time',
++                                                                      'type': 'string'},
++                                                  'model': {'$ref': '#/definitions/Model'}},
++                                   'required': ['model', 'last-connection'],
++                                   'type': 'object'},
++                     'UserModelList': {'additionalProperties': False,
++                                       'properties': {'user-models': {'items': {'$ref': '#/definitions/UserModel'},
++                                                                      'type': 'array'}},
++                                       'required': ['user-models'],
++                                       'type': 'object'}},
++     'properties': {'AllModels': {'properties': {'Result': {'$ref': '#/definitions/UserModelList'}},
++                                  'type': 'object'},
++                    'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                 'Result': {'$ref': '#/definitions/CloudSpecResults'}},
++                                  'type': 'object'},
++                    'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}},
++                                         'type': 'object'},
++                    'DestroyController': {'properties': {'Params': {'$ref': '#/definitions/DestroyControllerArgs'}},
++                                          'type': 'object'},
++                    'GetCloudSpec': {'properties': {'Params': {'$ref': '#/definitions/ModelTag'},
++                                                    'Result': {'$ref': '#/definitions/CloudSpecResult'}},
++                                     'type': 'object'},
++                    'GetControllerAccess': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                           'Result': {'$ref': '#/definitions/UserAccessResults'}},
++                                            'type': 'object'},
++                    'HostedModelConfigs': {'properties': {'Result': {'$ref': '#/definitions/HostedModelConfigsResults'}},
++                                           'type': 'object'},
++                    'InitiateMigration': {'properties': {'Params': {'$ref': '#/definitions/InitiateMigrationArgs'},
++                                                         'Result': {'$ref': '#/definitions/InitiateMigrationResults'}},
++                                          'type': 'object'},
++                    'ListBlockedModels': {'properties': {'Result': {'$ref': '#/definitions/ModelBlockInfoList'}},
++                                          'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResults'}},
++                                    'type': 'object'},
++                    'ModelStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ModelStatusResults'}},
++                                    'type': 'object'},
++                    'ModifyControllerAccess': {'properties': {'Params': {'$ref': '#/definitions/ModifyControllerAccessRequest'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'},
++                    'RemoveBlocks': {'properties': {'Params': {'$ref': '#/definitions/RemoveBlocksArgs'}},
++                                     'type': 'object'},
++                    'WatchAllModels': {'properties': {'Result': {'$ref': '#/definitions/AllWatcherId'}},
++                                       'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(UserModelList)
++    async def AllModels(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='AllModels', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudSpecResults)
++    async def CloudSpec(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='CloudSpec', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ControllerConfigResult)
++    async def ControllerConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='ControllerConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyController(self, destroy_models):
++        '''
++        destroy_models : bool
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='DestroyController', version=3, params=_params)
++        _params['destroy-models'] = destroy_models
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudSpecResult)
++    async def GetCloudSpec(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('CloudSpec')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='GetCloudSpec', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UserAccessResults)
++    async def GetControllerAccess(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~UserAccessResult]<~UserAccessResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='GetControllerAccess', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(HostedModelConfigsResults)
++    async def HostedModelConfigs(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostedModelConfig]<~HostedModelConfig>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='HostedModelConfigs', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(InitiateMigrationResults)
++    async def InitiateMigration(self, specs):
++        '''
++        specs : typing.Sequence<+T_co>[~MigrationSpec]<~MigrationSpec>
++        Returns -> typing.Sequence<+T_co>[~InitiateMigrationResult]<~InitiateMigrationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='InitiateMigration', version=3, params=_params)
++        _params['specs'] = specs
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelBlockInfoList)
++    async def ListBlockedModels(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~ModelBlockInfo]<~ModelBlockInfo>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='ListBlockedModels', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResults)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='ModelConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelStatusResults)
++    async def ModelStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='ModelStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ModifyControllerAccess(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~ModifyControllerAccess]<~ModifyControllerAccess>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='ModifyControllerAccess', version=3, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def RemoveBlocks(self, all_):
++        '''
++        all_ : bool
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='RemoveBlocks', version=3, params=_params)
++        _params['all'] = all_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AllWatcherId)
++    async def WatchAllModels(self):
++        '''
++
++        Returns -> str
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Controller', request='WatchAllModels', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class FirewallerFacade(Type):
++    name = 'Firewaller'
++    version = 3
++    schema =     {'definitions': {'BoolResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'result': {'type': 'boolean'}},
++                                    'required': ['result'],
++                                    'type': 'object'},
++                     'BoolResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/BoolResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'CloudCredential': {'additionalProperties': False,
++                                         'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                        'auth-type': {'type': 'string'},
++                                                        'redacted': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                         'required': ['auth-type'],
++                                         'type': 'object'},
++                     'CloudSpec': {'additionalProperties': False,
++                                   'properties': {'credential': {'$ref': '#/definitions/CloudCredential'},
++                                                  'endpoint': {'type': 'string'},
++                                                  'identity-endpoint': {'type': 'string'},
++                                                  'name': {'type': 'string'},
++                                                  'region': {'type': 'string'},
++                                                  'storage-endpoint': {'type': 'string'},
++                                                  'type': {'type': 'string'}},
++                                   'required': ['type', 'name'],
++                                   'type': 'object'},
++                     'CloudSpecResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'result': {'$ref': '#/definitions/CloudSpec'}},
++                                         'type': 'object'},
++                     'CloudSpecResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/CloudSpecResult'},
++                                                                     'type': 'array'}},
++                                          'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachinePortRange': {'additionalProperties': False,
++                                          'properties': {'port-range': {'$ref': '#/definitions/PortRange'},
++                                                         'relation-tag': {'type': 'string'},
++                                                         'unit-tag': {'type': 'string'}},
++                                          'required': ['unit-tag',
++                                                       'relation-tag',
++                                                       'port-range'],
++                                          'type': 'object'},
++                     'MachinePorts': {'additionalProperties': False,
++                                      'properties': {'machine-tag': {'type': 'string'},
++                                                     'subnet-tag': {'type': 'string'}},
++                                      'required': ['machine-tag', 'subnet-tag'],
++                                      'type': 'object'},
++                     'MachinePortsParams': {'additionalProperties': False,
++                                            'properties': {'params': {'items': {'$ref': '#/definitions/MachinePorts'},
++                                                                      'type': 'array'}},
++                                            'required': ['params'],
++                                            'type': 'object'},
++                     'MachinePortsResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'ports': {'items': {'$ref': '#/definitions/MachinePortRange'},
++                                                                     'type': 'array'}},
++                                            'required': ['ports'],
++                                            'type': 'object'},
++                     'MachinePortsResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/MachinePortsResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'ModelTag': {'additionalProperties': False, 'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'PortRange': {'additionalProperties': False,
++                                   'properties': {'from-port': {'type': 'integer'},
++                                                  'protocol': {'type': 'string'},
++                                                  'to-port': {'type': 'integer'}},
++                                   'required': ['from-port', 'to-port', 'protocol'],
++                                   'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'}},
++     'properties': {'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                 'Result': {'$ref': '#/definitions/CloudSpecResults'}},
++                                  'type': 'object'},
++                    'GetAssignedMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/StringResults'}},
++                                           'type': 'object'},
++                    'GetCloudSpec': {'properties': {'Params': {'$ref': '#/definitions/ModelTag'},
++                                                    'Result': {'$ref': '#/definitions/CloudSpecResult'}},
++                                     'type': 'object'},
++                    'GetExposed': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/BoolResults'}},
++                                   'type': 'object'},
++                    'GetMachineActiveSubnets': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                               'Result': {'$ref': '#/definitions/StringsResults'}},
++                                                'type': 'object'},
++                    'GetMachinePorts': {'properties': {'Params': {'$ref': '#/definitions/MachinePortsParams'},
++                                                       'Result': {'$ref': '#/definitions/MachinePortsResults'}},
++                                        'type': 'object'},
++                    'InstanceId': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringResults'}},
++                                   'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'},
++                    'WatchModelMachines': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                                           'type': 'object'},
++                    'WatchOpenedPorts': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                         'type': 'object'},
++                    'WatchUnits': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                   'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(CloudSpecResults)
++    async def CloudSpec(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='CloudSpec', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def GetAssignedMachine(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='GetAssignedMachine', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(CloudSpecResult)
++    async def GetCloudSpec(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('CloudSpec')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='GetCloudSpec', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BoolResults)
++    async def GetExposed(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='GetExposed', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResults)
++    async def GetMachineActiveSubnets(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='GetMachineActiveSubnets', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachinePortsResults)
++    async def GetMachinePorts(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~MachinePorts]<~MachinePorts>
++        Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='GetMachinePorts', version=3, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def InstanceId(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='InstanceId', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='Life', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='ModelConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='Watch', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='WatchForModelConfigChanges', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResult)
++    async def WatchModelMachines(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='WatchModelMachines', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchOpenedPorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='WatchOpenedPorts', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchUnits(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Firewaller', request='WatchUnits', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class InstancePollerFacade(Type):
++    name = 'InstancePoller'
++    version = 3
++    schema =     {'definitions': {'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'BoolResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'result': {'type': 'boolean'}},
++                                    'required': ['result'],
++                                    'type': 'object'},
++                     'BoolResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/BoolResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineAddresses': {'additionalProperties': False,
++                                          'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                       'type': 'array'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'addresses'],
++                                          'type': 'object'},
++                     'MachineAddressesResult': {'additionalProperties': False,
++                                                'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                             'type': 'array'},
++                                                               'error': {'$ref': '#/definitions/Error'}},
++                                                'required': ['addresses'],
++                                                'type': 'object'},
++                     'MachineAddressesResults': {'additionalProperties': False,
++                                                 'properties': {'results': {'items': {'$ref': '#/definitions/MachineAddressesResult'},
++                                                                            'type': 'array'}},
++                                                 'required': ['results'],
++                                                 'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'SetMachinesAddresses': {'additionalProperties': False,
++                                              'properties': {'machine-addresses': {'items': {'$ref': '#/definitions/MachineAddresses'},
++                                                                                   'type': 'array'}},
++                                              'required': ['machine-addresses'],
++                                              'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'StatusResult': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'id': {'type': 'string'},
++                                                     'info': {'type': 'string'},
++                                                     'life': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['id',
++                                                   'life',
++                                                   'status',
++                                                   'info',
++                                                   'data',
++                                                   'since'],
++                                      'type': 'object'},
++                     'StatusResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StatusResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'}},
++     'properties': {'AreManuallyProvisioned': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/BoolResults'}},
++                                               'type': 'object'},
++                    'InstanceId': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringResults'}},
++                                   'type': 'object'},
++                    'InstanceStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StatusResults'}},
++                                       'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'ProviderAddresses': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/MachineAddressesResults'}},
++                                          'type': 'object'},
++                    'SetInstanceStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SetProviderAddresses': {'properties': {'Params': {'$ref': '#/definitions/SetMachinesAddresses'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'Status': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/StatusResults'}},
++                               'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'},
++                    'WatchModelMachines': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(BoolResults)
++    async def AreManuallyProvisioned(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='AreManuallyProvisioned', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def InstanceId(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='InstanceId', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def InstanceStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='InstanceStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='Life', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='ModelConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachineAddressesResults)
++    async def ProviderAddresses(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachineAddressesResult]<~MachineAddressesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='ProviderAddresses', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetInstanceStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='SetInstanceStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetProviderAddresses(self, machine_addresses):
++        '''
++        machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='SetProviderAddresses', version=3, params=_params)
++        _params['machine-addresses'] = machine_addresses
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def Status(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='Status', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='WatchForModelConfigChanges', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResult)
++    async def WatchModelMachines(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='InstancePoller', request='WatchModelMachines', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class MachineManagerFacade(Type):
++    name = 'MachineManager'
++    version = 3
++    schema =     {'definitions': {'AddMachineParams': {'additionalProperties': False,
++                                          'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'},
++                                                                       'type': 'array'},
++                                                         'constraints': {'$ref': '#/definitions/Value'},
++                                                         'container-type': {'type': 'string'},
++                                                         'disks': {'items': {'$ref': '#/definitions/Constraints'},
++                                                                   'type': 'array'},
++                                                         'hardware-characteristics': {'$ref': '#/definitions/HardwareCharacteristics'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'jobs': {'items': {'type': 'string'},
++                                                                  'type': 'array'},
++                                                         'nonce': {'type': 'string'},
++                                                         'parent-id': {'type': 'string'},
++                                                         'placement': {'$ref': '#/definitions/Placement'},
++                                                         'series': {'type': 'string'}},
++                                          'required': ['series',
++                                                       'constraints',
++                                                       'jobs',
++                                                       'parent-id',
++                                                       'container-type',
++                                                       'instance-id',
++                                                       'nonce',
++                                                       'hardware-characteristics',
++                                                       'addresses'],
++                                          'type': 'object'},
++                     'AddMachines': {'additionalProperties': False,
++                                     'properties': {'params': {'items': {'$ref': '#/definitions/AddMachineParams'},
++                                                               'type': 'array'}},
++                                     'required': ['params'],
++                                     'type': 'object'},
++                     'AddMachinesResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'machine': {'type': 'string'}},
++                                           'required': ['machine'],
++                                           'type': 'object'},
++                     'AddMachinesResults': {'additionalProperties': False,
++                                            'properties': {'machines': {'items': {'$ref': '#/definitions/AddMachinesResult'},
++                                                                        'type': 'array'}},
++                                            'required': ['machines'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'DestroyMachineInfo': {'additionalProperties': False,
++                                            'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                 'type': 'array'},
++                                                           'destroyed-units': {'items': {'$ref': '#/definitions/Entity'},
++                                                                               'type': 'array'},
++                                                           'detached-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                'type': 'array'}},
++                                            'type': 'object'},
++                     'DestroyMachineResult': {'additionalProperties': False,
++                                              'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                             'info': {'$ref': '#/definitions/DestroyMachineInfo'}},
++                                              'type': 'object'},
++                     'DestroyMachineResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/DestroyMachineResult'},
++                                                                          'type': 'array'}},
++                                               'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'HardwareCharacteristics': {'additionalProperties': False,
++                                                 'properties': {'arch': {'type': 'string'},
++                                                                'availability-zone': {'type': 'string'},
++                                                                'cpu-cores': {'type': 'integer'},
++                                                                'cpu-power': {'type': 'integer'},
++                                                                'mem': {'type': 'integer'},
++                                                                'root-disk': {'type': 'integer'},
++                                                                'tags': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                                 'type': 'object'},
++                     'InstanceType': {'additionalProperties': False,
++                                      'properties': {'arches': {'items': {'type': 'string'},
++                                                                'type': 'array'},
++                                                     'cost': {'type': 'integer'},
++                                                     'cpu-cores': {'type': 'integer'},
++                                                     'deprecated': {'type': 'boolean'},
++                                                     'memory': {'type': 'integer'},
++                                                     'name': {'type': 'string'},
++                                                     'root-disk': {'type': 'integer'},
++                                                     'virt-type': {'type': 'string'}},
++                                      'required': ['arches', 'cpu-cores', 'memory'],
++                                      'type': 'object'},
++                     'InstanceTypesResult': {'additionalProperties': False,
++                                             'properties': {'cost-currency': {'type': 'string'},
++                                                            'cost-divisor': {'type': 'integer'},
++                                                            'cost-unit': {'type': 'string'},
++                                                            'error': {'$ref': '#/definitions/Error'},
++                                                            'instance-types': {'items': {'$ref': '#/definitions/InstanceType'},
++                                                                               'type': 'array'}},
++                                             'type': 'object'},
++                     'InstanceTypesResults': {'additionalProperties': False,
++                                              'properties': {'results': {'items': {'$ref': '#/definitions/InstanceTypesResult'},
++                                                                         'type': 'array'}},
++                                              'required': ['results'],
++                                              'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'ModelInstanceTypesConstraint': {'additionalProperties': False,
++                                                      'properties': {'value': {'$ref': '#/definitions/Value'}},
++                                                      'type': 'object'},
++                     'ModelInstanceTypesConstraints': {'additionalProperties': False,
++                                                       'properties': {'constraints': {'items': {'$ref': '#/definitions/ModelInstanceTypesConstraint'},
++                                                                                      'type': 'array'}},
++                                                       'required': ['constraints'],
++                                                       'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddMachines': {'properties': {'Params': {'$ref': '#/definitions/AddMachines'},
++                                                   'Result': {'$ref': '#/definitions/AddMachinesResults'}},
++                                    'type': 'object'},
++                    'DestroyMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/DestroyMachineResults'}},
++                                       'type': 'object'},
++                    'ForceDestroyMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                           'Result': {'$ref': '#/definitions/DestroyMachineResults'}},
++                                            'type': 'object'},
++                    'InstanceTypes': {'properties': {'Params': {'$ref': '#/definitions/ModelInstanceTypesConstraints'},
++                                                     'Result': {'$ref': '#/definitions/InstanceTypesResults'}},
++                                      'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddMachinesResults)
++    async def AddMachines(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='AddMachines', version=3, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyMachineResults)
++    async def DestroyMachine(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='DestroyMachine', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyMachineResults)
++    async def ForceDestroyMachine(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='ForceDestroyMachine', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(InstanceTypesResults)
++    async def InstanceTypes(self, constraints):
++        '''
++        constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint>
++        Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='MachineManager', request='InstanceTypes', version=3, params=_params)
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ModelManagerFacade(Type):
++    name = 'ModelManager'
++    version = 3
++    schema =     {'definitions': {'DumpModelRequest': {'additionalProperties': False,
++                                          'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                                      'type': 'array'},
++                                                         'simplified': {'type': 'boolean'}},
++                                          'required': ['entities', 'simplified'],
++                                          'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatus': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'info': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['status', 'info', 'since'],
++                                      'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineHardware': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'availability-zone': {'type': 'string'},
++                                                        'cores': {'type': 'integer'},
++                                                        'cpu-power': {'type': 'integer'},
++                                                        'mem': {'type': 'integer'},
++                                                        'root-disk': {'type': 'integer'},
++                                                        'tags': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                         'type': 'object'},
++                     'MapResult': {'additionalProperties': False,
++                                   'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                  'result': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                          'type': 'object'}},
++                                                             'type': 'object'}},
++                                   'required': ['result'],
++                                   'type': 'object'},
++                     'MapResults': {'additionalProperties': False,
++                                    'properties': {'results': {'items': {'$ref': '#/definitions/MapResult'},
++                                                               'type': 'array'}},
++                                    'required': ['results'],
++                                    'type': 'object'},
++                     'Model': {'additionalProperties': False,
++                               'properties': {'name': {'type': 'string'},
++                                              'owner-tag': {'type': 'string'},
++                                              'uuid': {'type': 'string'}},
++                               'required': ['name', 'uuid', 'owner-tag'],
++                               'type': 'object'},
++                     'ModelCreateArgs': {'additionalProperties': False,
++                                         'properties': {'cloud-tag': {'type': 'string'},
++                                                        'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                'type': 'object'}},
++                                                                   'type': 'object'},
++                                                        'credential': {'type': 'string'},
++                                                        'name': {'type': 'string'},
++                                                        'owner-tag': {'type': 'string'},
++                                                        'region': {'type': 'string'}},
++                                         'required': ['name', 'owner-tag'],
++                                         'type': 'object'},
++                     'ModelDefaultValues': {'additionalProperties': False,
++                                            'properties': {'cloud-region': {'type': 'string'},
++                                                           'cloud-tag': {'type': 'string'},
++                                                           'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                   'type': 'object'}},
++                                                                      'type': 'object'}},
++                                            'required': ['config'],
++                                            'type': 'object'},
++                     'ModelDefaults': {'additionalProperties': False,
++                                       'properties': {'controller': {'additionalProperties': True,
++                                                                     'type': 'object'},
++                                                      'default': {'additionalProperties': True,
++                                                                  'type': 'object'},
++                                                      'regions': {'items': {'$ref': '#/definitions/RegionDefaults'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'ModelDefaultsResult': {'additionalProperties': False,
++                                             'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ModelDefaults'}},
++                                                                       'type': 'object'}},
++                                             'required': ['config'],
++                                             'type': 'object'},
++                     'ModelInfo': {'additionalProperties': False,
++                                   'properties': {'agent-version': {'$ref': '#/definitions/Number'},
++                                                  'cloud-credential-tag': {'type': 'string'},
++                                                  'cloud-region': {'type': 'string'},
++                                                  'cloud-tag': {'type': 'string'},
++                                                  'controller-uuid': {'type': 'string'},
++                                                  'default-series': {'type': 'string'},
++                                                  'life': {'type': 'string'},
++                                                  'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                               'type': 'array'},
++                                                  'migration': {'$ref': '#/definitions/ModelMigrationStatus'},
++                                                  'name': {'type': 'string'},
++                                                  'owner-tag': {'type': 'string'},
++                                                  'provider-type': {'type': 'string'},
++                                                  'sla': {'$ref': '#/definitions/ModelSLAInfo'},
++                                                  'status': {'$ref': '#/definitions/EntityStatus'},
++                                                  'users': {'items': {'$ref': '#/definitions/ModelUserInfo'},
++                                                            'type': 'array'},
++                                                  'uuid': {'type': 'string'}},
++                                   'required': ['name',
++                                                'uuid',
++                                                'controller-uuid',
++                                                'cloud-tag',
++                                                'owner-tag',
++                                                'life',
++                                                'users',
++                                                'machines',
++                                                'sla',
++                                                'agent-version'],
++                                   'type': 'object'},
++                     'ModelInfoResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'result': {'$ref': '#/definitions/ModelInfo'}},
++                                         'type': 'object'},
++                     'ModelInfoResults': {'additionalProperties': False,
++                                          'properties': {'results': {'items': {'$ref': '#/definitions/ModelInfoResult'},
++                                                                     'type': 'array'}},
++                                          'required': ['results'],
++                                          'type': 'object'},
++                     'ModelMachineInfo': {'additionalProperties': False,
++                                          'properties': {'hardware': {'$ref': '#/definitions/MachineHardware'},
++                                                         'has-vote': {'type': 'boolean'},
++                                                         'id': {'type': 'string'},
++                                                         'instance-id': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'wants-vote': {'type': 'boolean'}},
++                                          'required': ['id'],
++                                          'type': 'object'},
++                     'ModelMigrationStatus': {'additionalProperties': False,
++                                              'properties': {'end': {'format': 'date-time',
++                                                                     'type': 'string'},
++                                                             'start': {'format': 'date-time',
++                                                                       'type': 'string'},
++                                                             'status': {'type': 'string'}},
++                                              'required': ['status', 'start'],
++                                              'type': 'object'},
++                     'ModelSLAInfo': {'additionalProperties': False,
++                                      'properties': {'level': {'type': 'string'},
++                                                     'owner': {'type': 'string'}},
++                                      'required': ['level', 'owner'],
++                                      'type': 'object'},
++                     'ModelStatus': {'additionalProperties': False,
++                                     'properties': {'application-count': {'type': 'integer'},
++                                                    'hosted-machine-count': {'type': 'integer'},
++                                                    'life': {'type': 'string'},
++                                                    'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'},
++                                                                 'type': 'array'},
++                                                    'model-tag': {'type': 'string'},
++                                                    'owner-tag': {'type': 'string'}},
++                                     'required': ['model-tag',
++                                                  'life',
++                                                  'hosted-machine-count',
++                                                  'application-count',
++                                                  'owner-tag'],
++                                     'type': 'object'},
++                     'ModelStatusResults': {'additionalProperties': False,
++                                            'properties': {'models': {'items': {'$ref': '#/definitions/ModelStatus'},
++                                                                      'type': 'array'}},
++                                            'required': ['models'],
++                                            'type': 'object'},
++                     'ModelUnsetKeys': {'additionalProperties': False,
++                                        'properties': {'cloud-region': {'type': 'string'},
++                                                       'cloud-tag': {'type': 'string'},
++                                                       'keys': {'items': {'type': 'string'},
++                                                                'type': 'array'}},
++                                        'required': ['keys'],
++                                        'type': 'object'},
++                     'ModelUserInfo': {'additionalProperties': False,
++                                       'properties': {'access': {'type': 'string'},
++                                                      'display-name': {'type': 'string'},
++                                                      'last-connection': {'format': 'date-time',
++                                                                          'type': 'string'},
++                                                      'user': {'type': 'string'}},
++                                       'required': ['user',
++                                                    'display-name',
++                                                    'last-connection',
++                                                    'access'],
++                                       'type': 'object'},
++                     'ModifyModelAccess': {'additionalProperties': False,
++                                           'properties': {'access': {'type': 'string'},
++                                                          'action': {'type': 'string'},
++                                                          'model-tag': {'type': 'string'},
++                                                          'user-tag': {'type': 'string'}},
++                                           'required': ['user-tag',
++                                                        'action',
++                                                        'access',
++                                                        'model-tag'],
++                                           'type': 'object'},
++                     'ModifyModelAccessRequest': {'additionalProperties': False,
++                                                  'properties': {'changes': {'items': {'$ref': '#/definitions/ModifyModelAccess'},
++                                                                             'type': 'array'}},
++                                                  'required': ['changes'],
++                                                  'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'RegionDefaults': {'additionalProperties': False,
++                                        'properties': {'region-name': {'type': 'string'},
++                                                       'value': {'additionalProperties': True,
++                                                                 'type': 'object'}},
++                                        'required': ['region-name', 'value'],
++                                        'type': 'object'},
++                     'SetModelDefaults': {'additionalProperties': False,
++                                          'properties': {'config': {'items': {'$ref': '#/definitions/ModelDefaultValues'},
++                                                                    'type': 'array'}},
++                                          'required': ['config'],
++                                          'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'UnsetModelDefaults': {'additionalProperties': False,
++                                            'properties': {'keys': {'items': {'$ref': '#/definitions/ModelUnsetKeys'},
++                                                                    'type': 'array'}},
++                                            'required': ['keys'],
++                                            'type': 'object'},
++                     'UserModel': {'additionalProperties': False,
++                                   'properties': {'last-connection': {'format': 'date-time',
++                                                                      'type': 'string'},
++                                                  'model': {'$ref': '#/definitions/Model'}},
++                                   'required': ['model', 'last-connection'],
++                                   'type': 'object'},
++                     'UserModelList': {'additionalProperties': False,
++                                       'properties': {'user-models': {'items': {'$ref': '#/definitions/UserModel'},
++                                                                      'type': 'array'}},
++                                       'required': ['user-models'],
++                                       'type': 'object'}},
++     'properties': {'CreateModel': {'properties': {'Params': {'$ref': '#/definitions/ModelCreateArgs'},
++                                                   'Result': {'$ref': '#/definitions/ModelInfo'}},
++                                    'type': 'object'},
++                    'DestroyModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'DumpModels': {'properties': {'Params': {'$ref': '#/definitions/DumpModelRequest'},
++                                                  'Result': {'$ref': '#/definitions/StringResults'}},
++                                   'type': 'object'},
++                    'DumpModelsDB': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/MapResults'}},
++                                     'type': 'object'},
++                    'ListModels': {'properties': {'Params': {'$ref': '#/definitions/Entity'},
++                                                  'Result': {'$ref': '#/definitions/UserModelList'}},
++                                   'type': 'object'},
++                    'ModelDefaults': {'properties': {'Result': {'$ref': '#/definitions/ModelDefaultsResult'}},
++                                      'type': 'object'},
++                    'ModelInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                 'Result': {'$ref': '#/definitions/ModelInfoResults'}},
++                                  'type': 'object'},
++                    'ModelStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ModelStatusResults'}},
++                                    'type': 'object'},
++                    'ModifyModelAccess': {'properties': {'Params': {'$ref': '#/definitions/ModifyModelAccessRequest'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SetModelDefaults': {'properties': {'Params': {'$ref': '#/definitions/SetModelDefaults'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'},
++                    'UnsetModelDefaults': {'properties': {'Params': {'$ref': '#/definitions/UnsetModelDefaults'},
++                                                          'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ModelInfo)
++    async def CreateModel(self, cloud_tag, config, credential, name, owner_tag, region):
++        '''
++        cloud_tag : str
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        credential : str
++        name : str
++        owner_tag : str
++        region : str
++        Returns -> typing.Union[_ForwardRef('Number'), _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='CreateModel', version=3, params=_params)
++        _params['cloud-tag'] = cloud_tag
++        _params['config'] = config
++        _params['credential'] = credential
++        _params['name'] = name
++        _params['owner-tag'] = owner_tag
++        _params['region'] = region
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyModels(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DestroyModels', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def DumpModels(self, entities, simplified):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        simplified : bool
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DumpModels', version=3, params=_params)
++        _params['entities'] = entities
++        _params['simplified'] = simplified
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MapResults)
++    async def DumpModelsDB(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='DumpModelsDB', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UserModelList)
++    async def ListModels(self, tag):
++        '''
++        tag : str
++        Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ListModels', version=3, params=_params)
++        _params['tag'] = tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelDefaultsResult)
++    async def ModelDefaults(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelDefaults', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelInfoResults)
++    async def ModelInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelInfo', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelStatusResults)
++    async def ModelStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModelStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ModifyModelAccess(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='ModifyModelAccess', version=3, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetModelDefaults(self, config):
++        '''
++        config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='SetModelDefaults', version=3, params=_params)
++        _params['config'] = config
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UnsetModelDefaults(self, keys):
++        '''
++        keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='ModelManager', request='UnsetModelDefaults', version=3, params=_params)
++        _params['keys'] = keys
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class ProvisionerFacade(Type):
++    name = 'Provisioner'
++    version = 3
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'Binary': {'additionalProperties': False,
++                                'properties': {'Arch': {'type': 'string'},
++                                               'Number': {'$ref': '#/definitions/Number'},
++                                               'Series': {'type': 'string'}},
++                                'required': ['Number', 'Series', 'Arch'],
++                                'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'CloudImageMetadata': {'additionalProperties': False,
++                                            'properties': {'arch': {'type': 'string'},
++                                                           'image-id': {'type': 'string'},
++                                                           'priority': {'type': 'integer'},
++                                                           'region': {'type': 'string'},
++                                                           'root-storage-size': {'type': 'integer'},
++                                                           'root-storage-type': {'type': 'string'},
++                                                           'series': {'type': 'string'},
++                                                           'source': {'type': 'string'},
++                                                           'stream': {'type': 'string'},
++                                                           'version': {'type': 'string'},
++                                                           'virt-type': {'type': 'string'}},
++                                            'required': ['image-id',
++                                                         'region',
++                                                         'version',
++                                                         'series',
++                                                         'arch',
++                                                         'source',
++                                                         'priority'],
++                                            'type': 'object'},
++                     'ConstraintsResult': {'additionalProperties': False,
++                                           'properties': {'constraints': {'$ref': '#/definitions/Value'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['constraints'],
++                                           'type': 'object'},
++                     'ConstraintsResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/ConstraintsResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'ContainerConfig': {'additionalProperties': False,
++                                         'properties': {'UpdateBehavior': {'$ref': '#/definitions/UpdateBehavior'},
++                                                        'apt-mirror': {'type': 'string'},
++                                                        'apt-proxy': {'$ref': '#/definitions/Settings'},
++                                                        'authorized-keys': {'type': 'string'},
++                                                        'provider-type': {'type': 'string'},
++                                                        'proxy': {'$ref': '#/definitions/Settings'},
++                                                        'ssl-hostname-verification': {'type': 'boolean'}},
++                                         'required': ['provider-type',
++                                                      'authorized-keys',
++                                                      'ssl-hostname-verification',
++                                                      'proxy',
++                                                      'apt-proxy',
++                                                      'apt-mirror',
++                                                      'UpdateBehavior'],
++                                         'type': 'object'},
++                     'ContainerManagerConfig': {'additionalProperties': False,
++                                                'properties': {'config': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                          'type': 'object'}},
++                                                'required': ['config'],
++                                                'type': 'object'},
++                     'ContainerManagerConfigParams': {'additionalProperties': False,
++                                                      'properties': {'type': {'type': 'string'}},
++                                                      'required': ['type'],
++                                                      'type': 'object'},
++                     'ControllerConfigResult': {'additionalProperties': False,
++                                                'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'}},
++                                                'required': ['config'],
++                                                'type': 'object'},
++                     'DeviceBridgeInfo': {'additionalProperties': False,
++                                          'properties': {'bridge-name': {'type': 'string'},
++                                                         'host-device-name': {'type': 'string'}},
++                                          'required': ['host-device-name',
++                                                       'bridge-name'],
++                                          'type': 'object'},
++                     'DistributionGroupResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'result': {'items': {'type': 'string'},
++                                                                           'type': 'array'}},
++                                                 'required': ['result'],
++                                                 'type': 'object'},
++                     'DistributionGroupResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/DistributionGroupResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityPassword': {'additionalProperties': False,
++                                        'properties': {'password': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'password'],
++                                        'type': 'object'},
++                     'EntityPasswords': {'additionalProperties': False,
++                                         'properties': {'changes': {'items': {'$ref': '#/definitions/EntityPassword'},
++                                                                    'type': 'array'}},
++                                         'required': ['changes'],
++                                         'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'FindToolsParams': {'additionalProperties': False,
++                                         'properties': {'arch': {'type': 'string'},
++                                                        'major': {'type': 'integer'},
++                                                        'minor': {'type': 'integer'},
++                                                        'number': {'$ref': '#/definitions/Number'},
++                                                        'series': {'type': 'string'}},
++                                         'required': ['number',
++                                                      'major',
++                                                      'minor',
++                                                      'arch',
++                                                      'series'],
++                                         'type': 'object'},
++                     'FindToolsResult': {'additionalProperties': False,
++                                         'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                        'list': {'items': {'$ref': '#/definitions/Tools'},
++                                                                 'type': 'array'}},
++                                         'required': ['list'],
++                                         'type': 'object'},
++                     'HardwareCharacteristics': {'additionalProperties': False,
++                                                 'properties': {'arch': {'type': 'string'},
++                                                                'availability-zone': {'type': 'string'},
++                                                                'cpu-cores': {'type': 'integer'},
++                                                                'cpu-power': {'type': 'integer'},
++                                                                'mem': {'type': 'integer'},
++                                                                'root-disk': {'type': 'integer'},
++                                                                'tags': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                                 'type': 'object'},
++                     'HostNetworkChange': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'new-bridges': {'items': {'$ref': '#/definitions/DeviceBridgeInfo'},
++                                                                          'type': 'array'},
++                                                          'reconfigure-delay': {'type': 'integer'}},
++                                           'required': ['new-bridges',
++                                                        'reconfigure-delay'],
++                                           'type': 'object'},
++                     'HostNetworkChangeResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/HostNetworkChange'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'InstanceInfo': {'additionalProperties': False,
++                                      'properties': {'characteristics': {'$ref': '#/definitions/HardwareCharacteristics'},
++                                                     'instance-id': {'type': 'string'},
++                                                     'network-config': {'items': {'$ref': '#/definitions/NetworkConfig'},
++                                                                        'type': 'array'},
++                                                     'nonce': {'type': 'string'},
++                                                     'tag': {'type': 'string'},
++                                                     'volume-attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/VolumeAttachmentInfo'}},
++                                                                            'type': 'object'},
++                                                     'volumes': {'items': {'$ref': '#/definitions/Volume'},
++                                                                 'type': 'array'}},
++                                      'required': ['tag',
++                                                   'instance-id',
++                                                   'nonce',
++                                                   'characteristics',
++                                                   'volumes',
++                                                   'volume-attachments',
++                                                   'network-config'],
++                                      'type': 'object'},
++                     'InstancesInfo': {'additionalProperties': False,
++                                       'properties': {'machines': {'items': {'$ref': '#/definitions/InstanceInfo'},
++                                                                   'type': 'array'}},
++                                       'required': ['machines'],
++                                       'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineContainers': {'additionalProperties': False,
++                                           'properties': {'container-types': {'items': {'type': 'string'},
++                                                                              'type': 'array'},
++                                                          'machine-tag': {'type': 'string'}},
++                                           'required': ['machine-tag',
++                                                        'container-types'],
++                                           'type': 'object'},
++                     'MachineContainersParams': {'additionalProperties': False,
++                                                 'properties': {'params': {'items': {'$ref': '#/definitions/MachineContainers'},
++                                                                           'type': 'array'}},
++                                                 'required': ['params'],
++                                                 'type': 'object'},
++                     'MachineNetworkConfigResult': {'additionalProperties': False,
++                                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                   'info': {'items': {'$ref': '#/definitions/NetworkConfig'},
++                                                                            'type': 'array'}},
++                                                    'required': ['info'],
++                                                    'type': 'object'},
++                     'MachineNetworkConfigResults': {'additionalProperties': False,
++                                                     'properties': {'results': {'items': {'$ref': '#/definitions/MachineNetworkConfigResult'},
++                                                                                'type': 'array'}},
++                                                     'required': ['results'],
++                                                     'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'NetworkConfig': {'additionalProperties': False,
++                                       'properties': {'address': {'type': 'string'},
++                                                      'cidr': {'type': 'string'},
++                                                      'config-type': {'type': 'string'},
++                                                      'device-index': {'type': 'integer'},
++                                                      'disabled': {'type': 'boolean'},
++                                                      'dns-search-domains': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                      'dns-servers': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                      'gateway-address': {'type': 'string'},
++                                                      'interface-name': {'type': 'string'},
++                                                      'interface-type': {'type': 'string'},
++                                                      'mac-address': {'type': 'string'},
++                                                      'mtu': {'type': 'integer'},
++                                                      'no-auto-start': {'type': 'boolean'},
++                                                      'parent-interface-name': {'type': 'string'},
++                                                      'provider-address-id': {'type': 'string'},
++                                                      'provider-id': {'type': 'string'},
++                                                      'provider-space-id': {'type': 'string'},
++                                                      'provider-subnet-id': {'type': 'string'},
++                                                      'provider-vlan-id': {'type': 'string'},
++                                                      'routes': {'items': {'$ref': '#/definitions/NetworkRoute'},
++                                                                 'type': 'array'},
++                                                      'vlan-tag': {'type': 'integer'}},
++                                       'required': ['device-index',
++                                                    'mac-address',
++                                                    'cidr',
++                                                    'mtu',
++                                                    'provider-id',
++                                                    'provider-subnet-id',
++                                                    'provider-space-id',
++                                                    'provider-address-id',
++                                                    'provider-vlan-id',
++                                                    'vlan-tag',
++                                                    'interface-name',
++                                                    'parent-interface-name',
++                                                    'interface-type',
++                                                    'disabled'],
++                                       'type': 'object'},
++                     'NetworkRoute': {'additionalProperties': False,
++                                      'properties': {'destination-cidr': {'type': 'string'},
++                                                     'gateway-ip': {'type': 'string'},
++                                                     'metric': {'type': 'integer'}},
++                                      'required': ['destination-cidr',
++                                                   'gateway-ip',
++                                                   'metric'],
++                                      'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'Number': {'additionalProperties': False,
++                                'properties': {'Build': {'type': 'integer'},
++                                               'Major': {'type': 'integer'},
++                                               'Minor': {'type': 'integer'},
++                                               'Patch': {'type': 'integer'},
++                                               'Tag': {'type': 'string'}},
++                                'required': ['Major',
++                                             'Minor',
++                                             'Tag',
++                                             'Patch',
++                                             'Build'],
++                                'type': 'object'},
++                     'ProvisioningInfo': {'additionalProperties': False,
++                                          'properties': {'constraints': {'$ref': '#/definitions/Value'},
++                                                         'controller-config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                            'type': 'object'}},
++                                                                               'type': 'object'},
++                                                         'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                               'type': 'object'},
++                                                         'image-metadata': {'items': {'$ref': '#/definitions/CloudImageMetadata'},
++                                                                            'type': 'array'},
++                                                         'jobs': {'items': {'type': 'string'},
++                                                                  'type': 'array'},
++                                                         'placement': {'type': 'string'},
++                                                         'series': {'type': 'string'},
++                                                         'subnets-to-zones': {'patternProperties': {'.*': {'items': {'type': 'string'},
++                                                                                                           'type': 'array'}},
++                                                                              'type': 'object'},
++                                                         'tags': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                         'volume-attachments': {'items': {'$ref': '#/definitions/VolumeAttachmentParams'},
++                                                                                'type': 'array'},
++                                                         'volumes': {'items': {'$ref': '#/definitions/VolumeParams'},
++                                                                     'type': 'array'}},
++                                          'required': ['constraints',
++                                                       'series',
++                                                       'placement',
++                                                       'jobs'],
++                                          'type': 'object'},
++                     'ProvisioningInfoResult': {'additionalProperties': False,
++                                                'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                               'result': {'$ref': '#/definitions/ProvisioningInfo'}},
++                                                'required': ['result'],
++                                                'type': 'object'},
++                     'ProvisioningInfoResults': {'additionalProperties': False,
++                                                 'properties': {'results': {'items': {'$ref': '#/definitions/ProvisioningInfoResult'},
++                                                                            'type': 'array'}},
++                                                 'required': ['results'],
++                                                 'type': 'object'},
++                     'SetMachineNetworkConfig': {'additionalProperties': False,
++                                                 'properties': {'config': {'items': {'$ref': '#/definitions/NetworkConfig'},
++                                                                           'type': 'array'},
++                                                                'tag': {'type': 'string'}},
++                                                 'required': ['tag', 'config'],
++                                                 'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'Settings': {'additionalProperties': False,
++                                  'properties': {'AutoNoProxy': {'type': 'string'},
++                                                 'Ftp': {'type': 'string'},
++                                                 'Http': {'type': 'string'},
++                                                 'Https': {'type': 'string'},
++                                                 'NoProxy': {'type': 'string'}},
++                                  'required': ['Http',
++                                               'Https',
++                                               'Ftp',
++                                               'NoProxy',
++                                               'AutoNoProxy'],
++                                  'type': 'object'},
++                     'StatusResult': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'id': {'type': 'string'},
++                                                     'info': {'type': 'string'},
++                                                     'life': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['id',
++                                                   'life',
++                                                   'status',
++                                                   'info',
++                                                   'data',
++                                                   'since'],
++                                      'type': 'object'},
++                     'StatusResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StatusResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'Tools': {'additionalProperties': False,
++                               'properties': {'sha256': {'type': 'string'},
++                                              'size': {'type': 'integer'},
++                                              'url': {'type': 'string'},
++                                              'version': {'$ref': '#/definitions/Binary'}},
++                               'required': ['version', 'url', 'size'],
++                               'type': 'object'},
++                     'ToolsResult': {'additionalProperties': False,
++                                     'properties': {'disable-ssl-hostname-verification': {'type': 'boolean'},
++                                                    'error': {'$ref': '#/definitions/Error'},
++                                                    'tools': {'items': {'$ref': '#/definitions/Tools'},
++                                                              'type': 'array'}},
++                                     'required': ['tools',
++                                                  'disable-ssl-hostname-verification'],
++                                     'type': 'object'},
++                     'ToolsResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ToolsResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'UpdateBehavior': {'additionalProperties': False,
++                                        'properties': {'enable-os-refresh-update': {'type': 'boolean'},
++                                                       'enable-os-upgrade': {'type': 'boolean'}},
++                                        'required': ['enable-os-refresh-update',
++                                                     'enable-os-upgrade'],
++                                        'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'},
++                     'Volume': {'additionalProperties': False,
++                                'properties': {'info': {'$ref': '#/definitions/VolumeInfo'},
++                                               'volume-tag': {'type': 'string'}},
++                                'required': ['volume-tag', 'info'],
++                                'type': 'object'},
++                     'VolumeAttachmentInfo': {'additionalProperties': False,
++                                              'properties': {'bus-address': {'type': 'string'},
++                                                             'device-link': {'type': 'string'},
++                                                             'device-name': {'type': 'string'},
++                                                             'read-only': {'type': 'boolean'}},
++                                              'type': 'object'},
++                     'VolumeAttachmentParams': {'additionalProperties': False,
++                                                'properties': {'instance-id': {'type': 'string'},
++                                                               'machine-tag': {'type': 'string'},
++                                                               'provider': {'type': 'string'},
++                                                               'read-only': {'type': 'boolean'},
++                                                               'volume-id': {'type': 'string'},
++                                                               'volume-tag': {'type': 'string'}},
++                                                'required': ['volume-tag',
++                                                             'machine-tag',
++                                                             'provider'],
++                                                'type': 'object'},
++                     'VolumeInfo': {'additionalProperties': False,
++                                    'properties': {'hardware-id': {'type': 'string'},
++                                                   'persistent': {'type': 'boolean'},
++                                                   'pool': {'type': 'string'},
++                                                   'size': {'type': 'integer'},
++                                                   'volume-id': {'type': 'string'},
++                                                   'wwn': {'type': 'string'}},
++                                    'required': ['volume-id', 'size', 'persistent'],
++                                    'type': 'object'},
++                     'VolumeParams': {'additionalProperties': False,
++                                      'properties': {'attachment': {'$ref': '#/definitions/VolumeAttachmentParams'},
++                                                     'attributes': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                 'type': 'object'}},
++                                                                    'type': 'object'},
++                                                     'provider': {'type': 'string'},
++                                                     'size': {'type': 'integer'},
++                                                     'tags': {'patternProperties': {'.*': {'type': 'string'}},
++                                                              'type': 'object'},
++                                                     'volume-tag': {'type': 'string'}},
++                                      'required': ['volume-tag',
++                                                   'size',
++                                                   'provider'],
++                                      'type': 'object'},
++                     'WatchContainer': {'additionalProperties': False,
++                                        'properties': {'container-type': {'type': 'string'},
++                                                       'machine-tag': {'type': 'string'}},
++                                        'required': ['machine-tag',
++                                                     'container-type'],
++                                        'type': 'object'},
++                     'WatchContainers': {'additionalProperties': False,
++                                         'properties': {'params': {'items': {'$ref': '#/definitions/WatchContainer'},
++                                                                   'type': 'array'}},
++                                         'required': ['params'],
++                                         'type': 'object'}},
++     'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                     'type': 'object'},
++                    'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'Constraints': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/ConstraintsResults'}},
++                                    'type': 'object'},
++                    'ContainerConfig': {'properties': {'Result': {'$ref': '#/definitions/ContainerConfig'}},
++                                        'type': 'object'},
++                    'ContainerManagerConfig': {'properties': {'Params': {'$ref': '#/definitions/ContainerManagerConfigParams'},
++                                                              'Result': {'$ref': '#/definitions/ContainerManagerConfig'}},
++                                               'type': 'object'},
++                    'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}},
++                                         'type': 'object'},
++                    'DistributionGroup': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/DistributionGroupResults'}},
++                                          'type': 'object'},
++                    'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'FindTools': {'properties': {'Params': {'$ref': '#/definitions/FindToolsParams'},
++                                                 'Result': {'$ref': '#/definitions/FindToolsResult'}},
++                                  'type': 'object'},
++                    'GetContainerInterfaceInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                 'Result': {'$ref': '#/definitions/MachineNetworkConfigResults'}},
++                                                  'type': 'object'},
++                    'HostChangesForContainers': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/HostNetworkChangeResults'}},
++                                                 'type': 'object'},
++                    'InstanceId': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringResults'}},
++                                   'type': 'object'},
++                    'InstanceStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StatusResults'}},
++                                       'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'MachinesWithTransientErrors': {'properties': {'Result': {'$ref': '#/definitions/StatusResults'}},
++                                                    'type': 'object'},
++                    'MarkMachinesForRemoval': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                  'type': 'object'},
++                    'PrepareContainerInterfaceInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                     'Result': {'$ref': '#/definitions/MachineNetworkConfigResults'}},
++                                                      'type': 'object'},
++                    'ProvisioningInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/ProvisioningInfoResults'}},
++                                         'type': 'object'},
++                    'ReleaseContainerAddresses': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                  'type': 'object'},
++                    'Remove': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'Series': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/StringResults'}},
++                               'type': 'object'},
++                    'SetHostMachineNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/SetMachineNetworkConfig'}},
++                                                    'type': 'object'},
++                    'SetInstanceInfo': {'properties': {'Params': {'$ref': '#/definitions/InstancesInfo'},
++                                                       'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                        'type': 'object'},
++                    'SetInstanceStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SetObservedNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/SetMachineNetworkConfig'}},
++                                                 'type': 'object'},
++                    'SetPasswords': {'properties': {'Params': {'$ref': '#/definitions/EntityPasswords'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'SetProviderNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                 'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'SetSupportedContainers': {'properties': {'Params': {'$ref': '#/definitions/MachineContainersParams'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'},
++                    'StateAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                       'type': 'object'},
++                    'Status': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/StatusResults'}},
++                               'type': 'object'},
++                    'Tools': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/ToolsResults'}},
++                              'type': 'object'},
++                    'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                          'type': 'object'},
++                    'WatchAllContainers': {'properties': {'Params': {'$ref': '#/definitions/WatchContainers'},
++                                                          'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                           'type': 'object'},
++                    'WatchContainers': {'properties': {'Params': {'$ref': '#/definitions/WatchContainers'},
++                                                       'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                        'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'},
++                    'WatchMachineErrorRetry': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                               'type': 'object'},
++                    'WatchModelMachines': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}},
++                                           'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResult)
++    async def APIAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='APIAddresses', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='APIHostPorts', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='CACert', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ConstraintsResults)
++    async def Constraints(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ConstraintsResult]<~ConstraintsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Constraints', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ContainerConfig)
++    async def ContainerConfig(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('UpdateBehavior'), str, _ForwardRef('Settings'), _ForwardRef('Settings'), bool]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ContainerConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ContainerManagerConfig)
++    async def ContainerManagerConfig(self, type_):
++        '''
++        type_ : str
++        Returns -> typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ContainerManagerConfig', version=3, params=_params)
++        _params['type'] = type_
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ControllerConfigResult)
++    async def ControllerConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ControllerConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DistributionGroupResults)
++    async def DistributionGroup(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DistributionGroupResult]<~DistributionGroupResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='DistributionGroup', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnsureDead(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='EnsureDead', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FindToolsResult)
++    async def FindTools(self, arch, major, minor, number, series):
++        '''
++        arch : str
++        major : int
++        minor : int
++        number : Number
++        series : str
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[~Tools]<~Tools>]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='FindTools', version=3, params=_params)
++        _params['arch'] = arch
++        _params['major'] = major
++        _params['minor'] = minor
++        _params['number'] = number
++        _params['series'] = series
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachineNetworkConfigResults)
++    async def GetContainerInterfaceInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='GetContainerInterfaceInfo', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(HostNetworkChangeResults)
++    async def HostChangesForContainers(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~HostNetworkChange]<~HostNetworkChange>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='HostChangesForContainers', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def InstanceId(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='InstanceId', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def InstanceStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='InstanceStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Life', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def MachinesWithTransientErrors(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='MachinesWithTransientErrors', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def MarkMachinesForRemoval(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='MarkMachinesForRemoval', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ModelConfig', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ModelUUID(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ModelUUID', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachineNetworkConfigResults)
++    async def PrepareContainerInterfaceInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='PrepareContainerInterfaceInfo', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ProvisioningInfoResults)
++    async def ProvisioningInfo(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ProvisioningInfoResult]<~ProvisioningInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ProvisioningInfo', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ReleaseContainerAddresses(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='ReleaseContainerAddresses', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Remove(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Remove', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def Series(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Series', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetHostMachineNetworkConfig(self, config, tag):
++        '''
++        config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        tag : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetHostMachineNetworkConfig', version=3, params=_params)
++        _params['config'] = config
++        _params['tag'] = tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetInstanceInfo(self, machines):
++        '''
++        machines : typing.Sequence<+T_co>[~InstanceInfo]<~InstanceInfo>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetInstanceInfo', version=3, params=_params)
++        _params['machines'] = machines
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetInstanceStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetInstanceStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetObservedNetworkConfig(self, config, tag):
++        '''
++        config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        tag : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetObservedNetworkConfig', version=3, params=_params)
++        _params['config'] = config
++        _params['tag'] = tag
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetPasswords(self, changes):
++        '''
++        changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetPasswords', version=3, params=_params)
++        _params['changes'] = changes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetProviderNetworkConfig(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetProviderNetworkConfig', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetSupportedContainers(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~MachineContainers]<~MachineContainers>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='SetSupportedContainers', version=3, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResult)
++    async def StateAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='StateAddresses', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def Status(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Status', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ToolsResults)
++    async def Tools(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='Tools', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='UpdateStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchAPIHostPorts(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchAPIHostPorts', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchAllContainers(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchAllContainers', version=3, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchContainers(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchContainers', version=3, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchForModelConfigChanges', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchMachineErrorRetry(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchMachineErrorRetry', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResult)
++    async def WatchModelMachines(self):
++        '''
++
++        Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Provisioner', request='WatchModelMachines', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class SpacesFacade(Type):
++    name = 'Spaces'
++    version = 3
++    schema =     {'definitions': {'CreateSpaceParams': {'additionalProperties': False,
++                                           'properties': {'provider-id': {'type': 'string'},
++                                                          'public': {'type': 'boolean'},
++                                                          'space-tag': {'type': 'string'},
++                                                          'subnet-tags': {'items': {'type': 'string'},
++                                                                          'type': 'array'}},
++                                           'required': ['subnet-tags',
++                                                        'space-tag',
++                                                        'public'],
++                                           'type': 'object'},
++                     'CreateSpacesParams': {'additionalProperties': False,
++                                            'properties': {'spaces': {'items': {'$ref': '#/definitions/CreateSpaceParams'},
++                                                                      'type': 'array'}},
++                                            'required': ['spaces'],
++                                            'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'ListSpacesResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/Space'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Space': {'additionalProperties': False,
++                               'properties': {'error': {'$ref': '#/definitions/Error'},
++                                              'name': {'type': 'string'},
++                                              'subnets': {'items': {'$ref': '#/definitions/Subnet'},
++                                                          'type': 'array'}},
++                               'required': ['name', 'subnets'],
++                               'type': 'object'},
++                     'Subnet': {'additionalProperties': False,
++                                'properties': {'cidr': {'type': 'string'},
++                                               'life': {'type': 'string'},
++                                               'provider-id': {'type': 'string'},
++                                               'provider-network-id': {'type': 'string'},
++                                               'provider-space-id': {'type': 'string'},
++                                               'space-tag': {'type': 'string'},
++                                               'status': {'type': 'string'},
++                                               'vlan-tag': {'type': 'integer'},
++                                               'zones': {'items': {'type': 'string'},
++                                                         'type': 'array'}},
++                                'required': ['cidr',
++                                             'vlan-tag',
++                                             'life',
++                                             'space-tag',
++                                             'zones'],
++                                'type': 'object'}},
++     'properties': {'CreateSpaces': {'properties': {'Params': {'$ref': '#/definitions/CreateSpacesParams'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'ListSpaces': {'properties': {'Result': {'$ref': '#/definitions/ListSpacesResults'}},
++                                   'type': 'object'},
++                    'ReloadSpaces': {'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def CreateSpaces(self, spaces):
++        '''
++        spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Spaces', request='CreateSpaces', version=3, params=_params)
++        _params['spaces'] = spaces
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ListSpacesResults)
++    async def ListSpaces(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~Space]<~Space>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Spaces', request='ListSpaces', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def ReloadSpaces(self):
++        '''
++
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Spaces', request='ReloadSpaces', version=3, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class StorageFacade(Type):
++    name = 'Storage'
++    version = 3
++    schema =     {'definitions': {'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatus': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'info': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['status', 'info', 'since'],
++                                      'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'FilesystemAttachmentDetails': {'additionalProperties': False,
++                                                     'properties': {'FilesystemAttachmentInfo': {'$ref': '#/definitions/FilesystemAttachmentInfo'},
++                                                                    'life': {'type': 'string'}},
++                                                     'required': ['FilesystemAttachmentInfo'],
++                                                     'type': 'object'},
++                     'FilesystemAttachmentInfo': {'additionalProperties': False,
++                                                  'properties': {'mount-point': {'type': 'string'},
++                                                                 'read-only': {'type': 'boolean'}},
++                                                  'type': 'object'},
++                     'FilesystemDetails': {'additionalProperties': False,
++                                           'properties': {'filesystem-tag': {'type': 'string'},
++                                                          'info': {'$ref': '#/definitions/FilesystemInfo'},
++                                                          'life': {'type': 'string'},
++                                                          'machine-attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/FilesystemAttachmentDetails'}},
++                                                                                  'type': 'object'},
++                                                          'status': {'$ref': '#/definitions/EntityStatus'},
++                                                          'storage': {'$ref': '#/definitions/StorageDetails'},
++                                                          'volume-tag': {'type': 'string'}},
++                                           'required': ['filesystem-tag',
++                                                        'info',
++                                                        'status'],
++                                           'type': 'object'},
++                     'FilesystemDetailsListResult': {'additionalProperties': False,
++                                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                    'result': {'items': {'$ref': '#/definitions/FilesystemDetails'},
++                                                                               'type': 'array'}},
++                                                     'type': 'object'},
++                     'FilesystemDetailsListResults': {'additionalProperties': False,
++                                                      'properties': {'results': {'items': {'$ref': '#/definitions/FilesystemDetailsListResult'},
++                                                                                 'type': 'array'}},
++                                                      'type': 'object'},
++                     'FilesystemFilter': {'additionalProperties': False,
++                                          'properties': {'machines': {'items': {'type': 'string'},
++                                                                      'type': 'array'}},
++                                          'type': 'object'},
++                     'FilesystemFilters': {'additionalProperties': False,
++                                           'properties': {'filters': {'items': {'$ref': '#/definitions/FilesystemFilter'},
++                                                                      'type': 'array'}},
++                                           'type': 'object'},
++                     'FilesystemInfo': {'additionalProperties': False,
++                                        'properties': {'filesystem-id': {'type': 'string'},
++                                                       'pool': {'type': 'string'},
++                                                       'size': {'type': 'integer'}},
++                                        'required': ['filesystem-id',
++                                                     'pool',
++                                                     'size'],
++                                        'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'StorageAddParams': {'additionalProperties': False,
++                                          'properties': {'name': {'type': 'string'},
++                                                         'storage': {'$ref': '#/definitions/StorageConstraints'},
++                                                         'unit': {'type': 'string'}},
++                                          'required': ['unit', 'name', 'storage'],
++                                          'type': 'object'},
++                     'StorageAttachmentDetails': {'additionalProperties': False,
++                                                  'properties': {'life': {'type': 'string'},
++                                                                 'location': {'type': 'string'},
++                                                                 'machine-tag': {'type': 'string'},
++                                                                 'storage-tag': {'type': 'string'},
++                                                                 'unit-tag': {'type': 'string'}},
++                                                  'required': ['storage-tag',
++                                                               'unit-tag',
++                                                               'machine-tag'],
++                                                  'type': 'object'},
++                     'StorageAttachmentId': {'additionalProperties': False,
++                                             'properties': {'storage-tag': {'type': 'string'},
++                                                            'unit-tag': {'type': 'string'}},
++                                             'required': ['storage-tag',
++                                                          'unit-tag'],
++                                             'type': 'object'},
++                     'StorageAttachmentIds': {'additionalProperties': False,
++                                              'properties': {'ids': {'items': {'$ref': '#/definitions/StorageAttachmentId'},
++                                                                     'type': 'array'}},
++                                              'required': ['ids'],
++                                              'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StorageDetails': {'additionalProperties': False,
++                                        'properties': {'attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/StorageAttachmentDetails'}},
++                                                                       'type': 'object'},
++                                                       'kind': {'type': 'integer'},
++                                                       'life': {'type': 'string'},
++                                                       'owner-tag': {'type': 'string'},
++                                                       'persistent': {'type': 'boolean'},
++                                                       'status': {'$ref': '#/definitions/EntityStatus'},
++                                                       'storage-tag': {'type': 'string'}},
++                                        'required': ['storage-tag',
++                                                     'owner-tag',
++                                                     'kind',
++                                                     'status',
++                                                     'persistent'],
++                                        'type': 'object'},
++                     'StorageDetailsListResult': {'additionalProperties': False,
++                                                  'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                 'result': {'items': {'$ref': '#/definitions/StorageDetails'},
++                                                                            'type': 'array'}},
++                                                  'type': 'object'},
++                     'StorageDetailsListResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/StorageDetailsListResult'},
++                                                                              'type': 'array'}},
++                                                   'type': 'object'},
++                     'StorageDetailsResult': {'additionalProperties': False,
++                                              'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                             'result': {'$ref': '#/definitions/StorageDetails'}},
++                                              'type': 'object'},
++                     'StorageDetailsResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/StorageDetailsResult'},
++                                                                          'type': 'array'}},
++                                               'type': 'object'},
++                     'StorageFilter': {'additionalProperties': False,
++                                       'type': 'object'},
++                     'StorageFilters': {'additionalProperties': False,
++                                        'properties': {'filters': {'items': {'$ref': '#/definitions/StorageFilter'},
++                                                                   'type': 'array'}},
++                                        'type': 'object'},
++                     'StoragePool': {'additionalProperties': False,
++                                     'properties': {'attrs': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                    'name': {'type': 'string'},
++                                                    'provider': {'type': 'string'}},
++                                     'required': ['name', 'provider', 'attrs'],
++                                     'type': 'object'},
++                     'StoragePoolFilter': {'additionalProperties': False,
++                                           'properties': {'names': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                          'providers': {'items': {'type': 'string'},
++                                                                        'type': 'array'}},
++                                           'type': 'object'},
++                     'StoragePoolFilters': {'additionalProperties': False,
++                                            'properties': {'filters': {'items': {'$ref': '#/definitions/StoragePoolFilter'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'StoragePoolsResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'storage-pools': {'items': {'$ref': '#/definitions/StoragePool'},
++                                                                             'type': 'array'}},
++                                            'type': 'object'},
++                     'StoragePoolsResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StoragePoolsResult'},
++                                                                        'type': 'array'}},
++                                             'type': 'object'},
++                     'StoragesAddParams': {'additionalProperties': False,
++                                           'properties': {'storages': {'items': {'$ref': '#/definitions/StorageAddParams'},
++                                                                       'type': 'array'}},
++                                           'required': ['storages'],
++                                           'type': 'object'},
++                     'VolumeAttachmentDetails': {'additionalProperties': False,
++                                                 'properties': {'VolumeAttachmentInfo': {'$ref': '#/definitions/VolumeAttachmentInfo'},
++                                                                'life': {'type': 'string'}},
++                                                 'required': ['VolumeAttachmentInfo'],
++                                                 'type': 'object'},
++                     'VolumeAttachmentInfo': {'additionalProperties': False,
++                                              'properties': {'bus-address': {'type': 'string'},
++                                                             'device-link': {'type': 'string'},
++                                                             'device-name': {'type': 'string'},
++                                                             'read-only': {'type': 'boolean'}},
++                                              'type': 'object'},
++                     'VolumeDetails': {'additionalProperties': False,
++                                       'properties': {'info': {'$ref': '#/definitions/VolumeInfo'},
++                                                      'life': {'type': 'string'},
++                                                      'machine-attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/VolumeAttachmentDetails'}},
++                                                                              'type': 'object'},
++                                                      'status': {'$ref': '#/definitions/EntityStatus'},
++                                                      'storage': {'$ref': '#/definitions/StorageDetails'},
++                                                      'volume-tag': {'type': 'string'}},
++                                       'required': ['volume-tag', 'info', 'status'],
++                                       'type': 'object'},
++                     'VolumeDetailsListResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'result': {'items': {'$ref': '#/definitions/VolumeDetails'},
++                                                                           'type': 'array'}},
++                                                 'type': 'object'},
++                     'VolumeDetailsListResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/VolumeDetailsListResult'},
++                                                                             'type': 'array'}},
++                                                  'type': 'object'},
++                     'VolumeFilter': {'additionalProperties': False,
++                                      'properties': {'machines': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                      'type': 'object'},
++                     'VolumeFilters': {'additionalProperties': False,
++                                       'properties': {'filters': {'items': {'$ref': '#/definitions/VolumeFilter'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'VolumeInfo': {'additionalProperties': False,
++                                    'properties': {'hardware-id': {'type': 'string'},
++                                                   'persistent': {'type': 'boolean'},
++                                                   'pool': {'type': 'string'},
++                                                   'size': {'type': 'integer'},
++                                                   'volume-id': {'type': 'string'},
++                                                   'wwn': {'type': 'string'}},
++                                    'required': ['volume-id', 'size', 'persistent'],
++                                    'type': 'object'}},
++     'properties': {'AddToUnit': {'properties': {'Params': {'$ref': '#/definitions/StoragesAddParams'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'Attach': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'CreatePool': {'properties': {'Params': {'$ref': '#/definitions/StoragePool'}},
++                                   'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'Detach': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'ListFilesystems': {'properties': {'Params': {'$ref': '#/definitions/FilesystemFilters'},
++                                                       'Result': {'$ref': '#/definitions/FilesystemDetailsListResults'}},
++                                        'type': 'object'},
++                    'ListPools': {'properties': {'Params': {'$ref': '#/definitions/StoragePoolFilters'},
++                                                 'Result': {'$ref': '#/definitions/StoragePoolsResults'}},
++                                  'type': 'object'},
++                    'ListStorageDetails': {'properties': {'Params': {'$ref': '#/definitions/StorageFilters'},
++                                                          'Result': {'$ref': '#/definitions/StorageDetailsListResults'}},
++                                           'type': 'object'},
++                    'ListVolumes': {'properties': {'Params': {'$ref': '#/definitions/VolumeFilters'},
++                                                   'Result': {'$ref': '#/definitions/VolumeDetailsListResults'}},
++                                    'type': 'object'},
++                    'StorageDetails': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StorageDetailsResults'}},
++                                       'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(ErrorResults)
++    async def AddToUnit(self, storages):
++        '''
++        storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='AddToUnit', version=3, params=_params)
++        _params['storages'] = storages
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Attach(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='Attach', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def CreatePool(self, attrs, name, provider):
++        '''
++        attrs : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        name : str
++        provider : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='CreatePool', version=3, params=_params)
++        _params['attrs'] = attrs
++        _params['name'] = name
++        _params['provider'] = provider
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Destroy(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='Destroy', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Detach(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='Detach', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FilesystemDetailsListResults)
++    async def ListFilesystems(self, filters):
++        '''
++        filters : typing.Sequence<+T_co>[~FilesystemFilter]<~FilesystemFilter>
++        Returns -> typing.Sequence<+T_co>[~FilesystemDetailsListResult]<~FilesystemDetailsListResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='ListFilesystems', version=3, params=_params)
++        _params['filters'] = filters
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StoragePoolsResults)
++    async def ListPools(self, filters):
++        '''
++        filters : typing.Sequence<+T_co>[~StoragePoolFilter]<~StoragePoolFilter>
++        Returns -> typing.Sequence<+T_co>[~StoragePoolsResult]<~StoragePoolsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='ListPools', version=3, params=_params)
++        _params['filters'] = filters
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageDetailsListResults)
++    async def ListStorageDetails(self, filters):
++        '''
++        filters : typing.Sequence<+T_co>[~StorageFilter]<~StorageFilter>
++        Returns -> typing.Sequence<+T_co>[~StorageDetailsListResult]<~StorageDetailsListResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='ListStorageDetails', version=3, params=_params)
++        _params['filters'] = filters
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(VolumeDetailsListResults)
++    async def ListVolumes(self, filters):
++        '''
++        filters : typing.Sequence<+T_co>[~VolumeFilter]<~VolumeFilter>
++        Returns -> typing.Sequence<+T_co>[~VolumeDetailsListResult]<~VolumeDetailsListResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='ListVolumes', version=3, params=_params)
++        _params['filters'] = filters
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageDetailsResults)
++    async def StorageDetails(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StorageDetailsResult]<~StorageDetailsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Storage', request='StorageDetails', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class StorageProvisionerFacade(Type):
++    name = 'StorageProvisioner'
++    version = 3
++    schema =     {'definitions': {'BlockDevice': {'additionalProperties': False,
++                                     'properties': {'BusAddress': {'type': 'string'},
++                                                    'DeviceLinks': {'items': {'type': 'string'},
++                                                                    'type': 'array'},
++                                                    'DeviceName': {'type': 'string'},
++                                                    'FilesystemType': {'type': 'string'},
++                                                    'HardwareId': {'type': 'string'},
++                                                    'InUse': {'type': 'boolean'},
++                                                    'Label': {'type': 'string'},
++                                                    'MountPoint': {'type': 'string'},
++                                                    'Size': {'type': 'integer'},
++                                                    'UUID': {'type': 'string'},
++                                                    'WWN': {'type': 'string'}},
++                                     'required': ['DeviceName',
++                                                  'DeviceLinks',
++                                                  'Label',
++                                                  'UUID',
++                                                  'HardwareId',
++                                                  'WWN',
++                                                  'BusAddress',
++                                                  'Size',
++                                                  'FilesystemType',
++                                                  'InUse',
++                                                  'MountPoint'],
++                                     'type': 'object'},
++                     'BlockDeviceResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'result': {'$ref': '#/definitions/BlockDevice'}},
++                                           'required': ['result'],
++                                           'type': 'object'},
++                     'BlockDeviceResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/BlockDeviceResult'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'Filesystem': {'additionalProperties': False,
++                                    'properties': {'filesystem-tag': {'type': 'string'},
++                                                   'info': {'$ref': '#/definitions/FilesystemInfo'},
++                                                   'volume-tag': {'type': 'string'}},
++                                    'required': ['filesystem-tag', 'info'],
++                                    'type': 'object'},
++                     'FilesystemAttachment': {'additionalProperties': False,
++                                              'properties': {'filesystem-tag': {'type': 'string'},
++                                                             'info': {'$ref': '#/definitions/FilesystemAttachmentInfo'},
++                                                             'machine-tag': {'type': 'string'}},
++                                              'required': ['filesystem-tag',
++                                                           'machine-tag',
++                                                           'info'],
++                                              'type': 'object'},
++                     'FilesystemAttachmentInfo': {'additionalProperties': False,
++                                                  'properties': {'mount-point': {'type': 'string'},
++                                                                 'read-only': {'type': 'boolean'}},
++                                                  'type': 'object'},
++                     'FilesystemAttachmentParams': {'additionalProperties': False,
++                                                    'properties': {'filesystem-id': {'type': 'string'},
++                                                                   'filesystem-tag': {'type': 'string'},
++                                                                   'instance-id': {'type': 'string'},
++                                                                   'machine-tag': {'type': 'string'},
++                                                                   'mount-point': {'type': 'string'},
++                                                                   'provider': {'type': 'string'},
++                                                                   'read-only': {'type': 'boolean'}},
++                                                    'required': ['filesystem-tag',
++                                                                 'machine-tag',
++                                                                 'provider'],
++                                                    'type': 'object'},
++                     'FilesystemAttachmentParamsResult': {'additionalProperties': False,
++                                                          'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                         'result': {'$ref': '#/definitions/FilesystemAttachmentParams'}},
++                                                          'required': ['result'],
++                                                          'type': 'object'},
++                     'FilesystemAttachmentParamsResults': {'additionalProperties': False,
++                                                           'properties': {'results': {'items': {'$ref': '#/definitions/FilesystemAttachmentParamsResult'},
++                                                                                      'type': 'array'}},
++                                                           'type': 'object'},
++                     'FilesystemAttachmentResult': {'additionalProperties': False,
++                                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                   'result': {'$ref': '#/definitions/FilesystemAttachment'}},
++                                                    'required': ['result'],
++                                                    'type': 'object'},
++                     'FilesystemAttachmentResults': {'additionalProperties': False,
++                                                     'properties': {'results': {'items': {'$ref': '#/definitions/FilesystemAttachmentResult'},
++                                                                                'type': 'array'}},
++                                                     'type': 'object'},
++                     'FilesystemAttachments': {'additionalProperties': False,
++                                               'properties': {'filesystem-attachments': {'items': {'$ref': '#/definitions/FilesystemAttachment'},
++                                                                                         'type': 'array'}},
++                                               'required': ['filesystem-attachments'],
++                                               'type': 'object'},
++                     'FilesystemInfo': {'additionalProperties': False,
++                                        'properties': {'filesystem-id': {'type': 'string'},
++                                                       'pool': {'type': 'string'},
++                                                       'size': {'type': 'integer'}},
++                                        'required': ['filesystem-id',
++                                                     'pool',
++                                                     'size'],
++                                        'type': 'object'},
++                     'FilesystemParams': {'additionalProperties': False,
++                                          'properties': {'attachment': {'$ref': '#/definitions/FilesystemAttachmentParams'},
++                                                         'attributes': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                     'type': 'object'}},
++                                                                        'type': 'object'},
++                                                         'filesystem-tag': {'type': 'string'},
++                                                         'provider': {'type': 'string'},
++                                                         'size': {'type': 'integer'},
++                                                         'tags': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                  'type': 'object'},
++                                                         'volume-tag': {'type': 'string'}},
++                                          'required': ['filesystem-tag',
++                                                       'size',
++                                                       'provider'],
++                                          'type': 'object'},
++                     'FilesystemParamsResult': {'additionalProperties': False,
++                                                'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                               'result': {'$ref': '#/definitions/FilesystemParams'}},
++                                                'required': ['result'],
++                                                'type': 'object'},
++                     'FilesystemParamsResults': {'additionalProperties': False,
++                                                 'properties': {'results': {'items': {'$ref': '#/definitions/FilesystemParamsResult'},
++                                                                            'type': 'array'}},
++                                                 'type': 'object'},
++                     'FilesystemResult': {'additionalProperties': False,
++                                          'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                         'result': {'$ref': '#/definitions/Filesystem'}},
++                                          'required': ['result'],
++                                          'type': 'object'},
++                     'FilesystemResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/FilesystemResult'},
++                                                                      'type': 'array'}},
++                                           'type': 'object'},
++                     'Filesystems': {'additionalProperties': False,
++                                     'properties': {'filesystems': {'items': {'$ref': '#/definitions/Filesystem'},
++                                                                    'type': 'array'}},
++                                     'required': ['filesystems'],
++                                     'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachineStorageId': {'additionalProperties': False,
++                                          'properties': {'attachment-tag': {'type': 'string'},
++                                                         'machine-tag': {'type': 'string'}},
++                                          'required': ['machine-tag',
++                                                       'attachment-tag'],
++                                          'type': 'object'},
++                     'MachineStorageIds': {'additionalProperties': False,
++                                           'properties': {'ids': {'items': {'$ref': '#/definitions/MachineStorageId'},
++                                                                  'type': 'array'}},
++                                           'required': ['ids'],
++                                           'type': 'object'},
++                     'MachineStorageIdsWatchResult': {'additionalProperties': False,
++                                                      'properties': {'changes': {'items': {'$ref': '#/definitions/MachineStorageId'},
++                                                                                 'type': 'array'},
++                                                                     'error': {'$ref': '#/definitions/Error'},
++                                                                     'watcher-id': {'type': 'string'}},
++                                                      'required': ['watcher-id',
++                                                                   'changes'],
++                                                      'type': 'object'},
++                     'MachineStorageIdsWatchResults': {'additionalProperties': False,
++                                                       'properties': {'results': {'items': {'$ref': '#/definitions/MachineStorageIdsWatchResult'},
++                                                                                  'type': 'array'}},
++                                                       'required': ['results'],
++                                                       'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'Volume': {'additionalProperties': False,
++                                'properties': {'info': {'$ref': '#/definitions/VolumeInfo'},
++                                               'volume-tag': {'type': 'string'}},
++                                'required': ['volume-tag', 'info'],
++                                'type': 'object'},
++                     'VolumeAttachment': {'additionalProperties': False,
++                                          'properties': {'info': {'$ref': '#/definitions/VolumeAttachmentInfo'},
++                                                         'machine-tag': {'type': 'string'},
++                                                         'volume-tag': {'type': 'string'}},
++                                          'required': ['volume-tag',
++                                                       'machine-tag',
++                                                       'info'],
++                                          'type': 'object'},
++                     'VolumeAttachmentInfo': {'additionalProperties': False,
++                                              'properties': {'bus-address': {'type': 'string'},
++                                                             'device-link': {'type': 'string'},
++                                                             'device-name': {'type': 'string'},
++                                                             'read-only': {'type': 'boolean'}},
++                                              'type': 'object'},
++                     'VolumeAttachmentParams': {'additionalProperties': False,
++                                                'properties': {'instance-id': {'type': 'string'},
++                                                               'machine-tag': {'type': 'string'},
++                                                               'provider': {'type': 'string'},
++                                                               'read-only': {'type': 'boolean'},
++                                                               'volume-id': {'type': 'string'},
++                                                               'volume-tag': {'type': 'string'}},
++                                                'required': ['volume-tag',
++                                                             'machine-tag',
++                                                             'provider'],
++                                                'type': 'object'},
++                     'VolumeAttachmentParamsResult': {'additionalProperties': False,
++                                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                     'result': {'$ref': '#/definitions/VolumeAttachmentParams'}},
++                                                      'required': ['result'],
++                                                      'type': 'object'},
++                     'VolumeAttachmentParamsResults': {'additionalProperties': False,
++                                                       'properties': {'results': {'items': {'$ref': '#/definitions/VolumeAttachmentParamsResult'},
++                                                                                  'type': 'array'}},
++                                                       'type': 'object'},
++                     'VolumeAttachmentResult': {'additionalProperties': False,
++                                                'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                               'result': {'$ref': '#/definitions/VolumeAttachment'}},
++                                                'required': ['result'],
++                                                'type': 'object'},
++                     'VolumeAttachmentResults': {'additionalProperties': False,
++                                                 'properties': {'results': {'items': {'$ref': '#/definitions/VolumeAttachmentResult'},
++                                                                            'type': 'array'}},
++                                                 'type': 'object'},
++                     'VolumeAttachments': {'additionalProperties': False,
++                                           'properties': {'volume-attachments': {'items': {'$ref': '#/definitions/VolumeAttachment'},
++                                                                                 'type': 'array'}},
++                                           'required': ['volume-attachments'],
++                                           'type': 'object'},
++                     'VolumeInfo': {'additionalProperties': False,
++                                    'properties': {'hardware-id': {'type': 'string'},
++                                                   'persistent': {'type': 'boolean'},
++                                                   'pool': {'type': 'string'},
++                                                   'size': {'type': 'integer'},
++                                                   'volume-id': {'type': 'string'},
++                                                   'wwn': {'type': 'string'}},
++                                    'required': ['volume-id', 'size', 'persistent'],
++                                    'type': 'object'},
++                     'VolumeParams': {'additionalProperties': False,
++                                      'properties': {'attachment': {'$ref': '#/definitions/VolumeAttachmentParams'},
++                                                     'attributes': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                 'type': 'object'}},
++                                                                    'type': 'object'},
++                                                     'provider': {'type': 'string'},
++                                                     'size': {'type': 'integer'},
++                                                     'tags': {'patternProperties': {'.*': {'type': 'string'}},
++                                                              'type': 'object'},
++                                                     'volume-tag': {'type': 'string'}},
++                                      'required': ['volume-tag',
++                                                   'size',
++                                                   'provider'],
++                                      'type': 'object'},
++                     'VolumeParamsResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'result': {'$ref': '#/definitions/VolumeParams'}},
++                                            'required': ['result'],
++                                            'type': 'object'},
++                     'VolumeParamsResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/VolumeParamsResult'},
++                                                                        'type': 'array'}},
++                                             'type': 'object'},
++                     'VolumeResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'$ref': '#/definitions/Volume'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'VolumeResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/VolumeResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'Volumes': {'additionalProperties': False,
++                                 'properties': {'volumes': {'items': {'$ref': '#/definitions/Volume'},
++                                                            'type': 'array'}},
++                                 'required': ['volumes'],
++                                 'type': 'object'}},
++     'properties': {'AttachmentLife': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                      'Result': {'$ref': '#/definitions/LifeResults'}},
++                                       'type': 'object'},
++                    'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'FilesystemAttachmentParams': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                                  'Result': {'$ref': '#/definitions/FilesystemAttachmentParamsResults'}},
++                                                   'type': 'object'},
++                    'FilesystemAttachments': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                             'Result': {'$ref': '#/definitions/FilesystemAttachmentResults'}},
++                                              'type': 'object'},
++                    'FilesystemParams': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/FilesystemParamsResults'}},
++                                         'type': 'object'},
++                    'Filesystems': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/FilesystemResults'}},
++                                    'type': 'object'},
++                    'InstanceId': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StringResults'}},
++                                   'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'Remove': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'RemoveAttachment': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'},
++                    'SetFilesystemAttachmentInfo': {'properties': {'Params': {'$ref': '#/definitions/FilesystemAttachments'},
++                                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                    'type': 'object'},
++                    'SetFilesystemInfo': {'properties': {'Params': {'$ref': '#/definitions/Filesystems'},
++                                                         'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                          'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'SetVolumeAttachmentInfo': {'properties': {'Params': {'$ref': '#/definitions/VolumeAttachments'},
++                                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                'type': 'object'},
++                    'SetVolumeInfo': {'properties': {'Params': {'$ref': '#/definitions/Volumes'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'VolumeAttachmentParams': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                              'Result': {'$ref': '#/definitions/VolumeAttachmentParamsResults'}},
++                                               'type': 'object'},
++                    'VolumeAttachments': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                         'Result': {'$ref': '#/definitions/VolumeAttachmentResults'}},
++                                          'type': 'object'},
++                    'VolumeBlockDevices': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'},
++                                                          'Result': {'$ref': '#/definitions/BlockDeviceResults'}},
++                                           'type': 'object'},
++                    'VolumeParams': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/VolumeParamsResults'}},
++                                     'type': 'object'},
++                    'Volumes': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/VolumeResults'}},
++                                'type': 'object'},
++                    'WatchBlockDevices': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                          'type': 'object'},
++                    'WatchFilesystemAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                  'Result': {'$ref': '#/definitions/MachineStorageIdsWatchResults'}},
++                                                   'type': 'object'},
++                    'WatchFilesystems': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                         'type': 'object'},
++                    'WatchMachines': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                      'type': 'object'},
++                    'WatchVolumeAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/MachineStorageIdsWatchResults'}},
++                                               'type': 'object'},
++                    'WatchVolumes': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                     'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(LifeResults)
++    async def AttachmentLife(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='AttachmentLife', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnsureDead(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='EnsureDead', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FilesystemAttachmentParamsResults)
++    async def FilesystemAttachmentParams(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~FilesystemAttachmentParamsResult]<~FilesystemAttachmentParamsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='FilesystemAttachmentParams', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FilesystemAttachmentResults)
++    async def FilesystemAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~FilesystemAttachmentResult]<~FilesystemAttachmentResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='FilesystemAttachments', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FilesystemParamsResults)
++    async def FilesystemParams(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~FilesystemParamsResult]<~FilesystemParamsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='FilesystemParams', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(FilesystemResults)
++    async def Filesystems(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~FilesystemResult]<~FilesystemResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='Filesystems', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def InstanceId(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='InstanceId', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='Life', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Remove(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='Remove', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RemoveAttachment(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='RemoveAttachment', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetFilesystemAttachmentInfo(self, filesystem_attachments):
++        '''
++        filesystem_attachments : typing.Sequence<+T_co>[~FilesystemAttachment]<~FilesystemAttachment>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='SetFilesystemAttachmentInfo', version=3, params=_params)
++        _params['filesystem-attachments'] = filesystem_attachments
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetFilesystemInfo(self, filesystems):
++        '''
++        filesystems : typing.Sequence<+T_co>[~Filesystem]<~Filesystem>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='SetFilesystemInfo', version=3, params=_params)
++        _params['filesystems'] = filesystems
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='SetStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetVolumeAttachmentInfo(self, volume_attachments):
++        '''
++        volume_attachments : typing.Sequence<+T_co>[~VolumeAttachment]<~VolumeAttachment>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='SetVolumeAttachmentInfo', version=3, params=_params)
++        _params['volume-attachments'] = volume_attachments
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetVolumeInfo(self, volumes):
++        '''
++        volumes : typing.Sequence<+T_co>[~Volume]<~Volume>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='SetVolumeInfo', version=3, params=_params)
++        _params['volumes'] = volumes
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='UpdateStatus', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(VolumeAttachmentParamsResults)
++    async def VolumeAttachmentParams(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~VolumeAttachmentParamsResult]<~VolumeAttachmentParamsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='VolumeAttachmentParams', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(VolumeAttachmentResults)
++    async def VolumeAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~VolumeAttachmentResult]<~VolumeAttachmentResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='VolumeAttachments', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BlockDeviceResults)
++    async def VolumeBlockDevices(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        Returns -> typing.Sequence<+T_co>[~BlockDeviceResult]<~BlockDeviceResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='VolumeBlockDevices', version=3, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(VolumeParamsResults)
++    async def VolumeParams(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~VolumeParamsResult]<~VolumeParamsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='VolumeParams', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(VolumeResults)
++    async def Volumes(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~VolumeResult]<~VolumeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='Volumes', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchBlockDevices(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchBlockDevices', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachineStorageIdsWatchResults)
++    async def WatchFilesystemAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchFilesystemAttachments', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchFilesystems(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchFilesystems', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchMachines(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchMachines', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachineStorageIdsWatchResults)
++    async def WatchVolumeAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchVolumeAttachments', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchVolumes(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='StorageProvisioner', request='WatchVolumes', version=3, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
index 0000000,0000000..68ee3f9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2671 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++from juju.client._definitions import *
++
++
++class ApplicationFacade(Type):
++    name = 'Application'
++    version = 4
++    schema =     {'definitions': {'AddApplicationUnits': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'num-units': {'type': 'integer'},
++                                                            'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                          'type': 'array'}},
++                                             'required': ['application',
++                                                          'num-units',
++                                                          'placement'],
++                                             'type': 'object'},
++                     'AddApplicationUnitsResults': {'additionalProperties': False,
++                                                    'properties': {'units': {'items': {'type': 'string'},
++                                                                             'type': 'array'}},
++                                                    'required': ['units'],
++                                                    'type': 'object'},
++                     'AddRelation': {'additionalProperties': False,
++                                     'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                     'required': ['endpoints'],
++                                     'type': 'object'},
++                     'AddRelationResults': {'additionalProperties': False,
++                                            'properties': {'endpoints': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                                         'type': 'object'}},
++                                            'required': ['endpoints'],
++                                            'type': 'object'},
++                     'ApplicationCharmRelations': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'ApplicationCharmRelationsResults': {'additionalProperties': False,
++                                                          'properties': {'charm-relations': {'items': {'type': 'string'},
++                                                                                             'type': 'array'}},
++                                                          'required': ['charm-relations'],
++                                                          'type': 'object'},
++                     'ApplicationDeploy': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'channel': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'config': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                     'type': 'object'},
++                                                          'config-yaml': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                          'num-units': {'type': 'integer'},
++                                                          'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                        'type': 'array'},
++                                                          'resources': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                        'type': 'object'},
++                                                          'series': {'type': 'string'},
++                                                          'storage': {'patternProperties': {'.*': {'$ref': '#/definitions/Constraints'}},
++                                                                      'type': 'object'}},
++                                           'required': ['application',
++                                                        'series',
++                                                        'charm-url',
++                                                        'channel',
++                                                        'num-units',
++                                                        'config-yaml',
++                                                        'constraints'],
++                                           'type': 'object'},
++                     'ApplicationDestroy': {'additionalProperties': False,
++                                            'properties': {'application': {'type': 'string'}},
++                                            'required': ['application'],
++                                            'type': 'object'},
++                     'ApplicationExpose': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'}},
++                                           'required': ['application'],
++                                           'type': 'object'},
++                     'ApplicationGet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'}},
++                                        'required': ['application'],
++                                        'type': 'object'},
++                     'ApplicationGetResults': {'additionalProperties': False,
++                                               'properties': {'application': {'type': 'string'},
++                                                              'charm': {'type': 'string'},
++                                                              'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                      'type': 'object'}},
++                                                                         'type': 'object'},
++                                                              'constraints': {'$ref': '#/definitions/Value'},
++                                                              'series': {'type': 'string'}},
++                                               'required': ['application',
++                                                            'charm',
++                                                            'config',
++                                                            'constraints',
++                                                            'series'],
++                                               'type': 'object'},
++                     'ApplicationMetricCredential': {'additionalProperties': False,
++                                                     'properties': {'application': {'type': 'string'},
++                                                                    'metrics-credentials': {'items': {'type': 'integer'},
++                                                                                            'type': 'array'}},
++                                                     'required': ['application',
++                                                                  'metrics-credentials'],
++                                                     'type': 'object'},
++                     'ApplicationMetricCredentials': {'additionalProperties': False,
++                                                      'properties': {'creds': {'items': {'$ref': '#/definitions/ApplicationMetricCredential'},
++                                                                               'type': 'array'}},
++                                                      'required': ['creds'],
++                                                      'type': 'object'},
++                     'ApplicationSet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'options': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                   'type': 'object'}},
++                                        'required': ['application', 'options'],
++                                        'type': 'object'},
++                     'ApplicationSetCharm': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'channel': {'type': 'string'},
++                                                            'charm-url': {'type': 'string'},
++                                                            'config-settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                            'config-settings-yaml': {'type': 'string'},
++                                                            'force-series': {'type': 'boolean'},
++                                                            'force-units': {'type': 'boolean'},
++                                                            'resource-ids': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                             'type': 'object'},
++                                                            'storage-constraints': {'patternProperties': {'.*': {'$ref': '#/definitions/StorageConstraints'}},
++                                                                                    'type': 'object'}},
++                                             'required': ['application',
++                                                          'charm-url',
++                                                          'channel',
++                                                          'force-units',
++                                                          'force-series'],
++                                             'type': 'object'},
++                     'ApplicationURLs': {'additionalProperties': False,
++                                         'properties': {'application-urls': {'items': {'type': 'string'},
++                                                                             'type': 'array'}},
++                                         'type': 'object'},
++                     'ApplicationUnexpose': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'}},
++                                             'required': ['application'],
++                                             'type': 'object'},
++                     'ApplicationUnset': {'additionalProperties': False,
++                                          'properties': {'application': {'type': 'string'},
++                                                         'options': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                          'required': ['application', 'options'],
++                                          'type': 'object'},
++                     'ApplicationUpdate': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'force-charm-url': {'type': 'boolean'},
++                                                          'force-series': {'type': 'boolean'},
++                                                          'min-units': {'type': 'integer'},
++                                                          'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                       'type': 'object'},
++                                                          'settings-yaml': {'type': 'string'}},
++                                           'required': ['application',
++                                                        'charm-url',
++                                                        'force-charm-url',
++                                                        'force-series',
++                                                        'settings-yaml'],
++                                           'type': 'object'},
++                     'ApplicationsDeploy': {'additionalProperties': False,
++                                            'properties': {'applications': {'items': {'$ref': '#/definitions/ApplicationDeploy'},
++                                                                            'type': 'array'}},
++                                            'required': ['applications'],
++                                            'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'ConsumeApplicationArg': {'additionalProperties': False,
++                                               'properties': {'application-alias': {'type': 'string'},
++                                                              'application-url': {'type': 'string'}},
++                                               'required': ['application-url'],
++                                               'type': 'object'},
++                     'ConsumeApplicationArgs': {'additionalProperties': False,
++                                                'properties': {'args': {'items': {'$ref': '#/definitions/ConsumeApplicationArg'},
++                                                                        'type': 'array'}},
++                                                'type': 'object'},
++                     'ConsumeApplicationResult': {'additionalProperties': False,
++                                                  'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                 'local-name': {'type': 'string'}},
++                                                  'type': 'object'},
++                     'ConsumeApplicationResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/ConsumeApplicationResult'},
++                                                                              'type': 'array'}},
++                                                   'required': ['results'],
++                                                   'type': 'object'},
++                     'DestroyApplicationInfo': {'additionalProperties': False,
++                                                'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                     'type': 'array'},
++                                                               'destroyed-units': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                   'type': 'array'},
++                                                               'detached-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                    'type': 'array'}},
++                                                'type': 'object'},
++                     'DestroyApplicationResult': {'additionalProperties': False,
++                                                  'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                 'info': {'$ref': '#/definitions/DestroyApplicationInfo'}},
++                                                  'type': 'object'},
++                     'DestroyApplicationResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/DestroyApplicationResult'},
++                                                                              'type': 'array'}},
++                                                   'type': 'object'},
++                     'DestroyApplicationUnits': {'additionalProperties': False,
++                                                 'properties': {'unit-names': {'items': {'type': 'string'},
++                                                                               'type': 'array'}},
++                                                 'required': ['unit-names'],
++                                                 'type': 'object'},
++                     'DestroyRelation': {'additionalProperties': False,
++                                         'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                      'type': 'array'}},
++                                         'required': ['endpoints'],
++                                         'type': 'object'},
++                     'DestroyUnitInfo': {'additionalProperties': False,
++                                         'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                              'type': 'array'},
++                                                        'detached-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                             'type': 'array'}},
++                                         'type': 'object'},
++                     'DestroyUnitResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'info': {'$ref': '#/definitions/DestroyUnitInfo'}},
++                                           'type': 'object'},
++                     'DestroyUnitResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/DestroyUnitResult'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetApplicationConstraints': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'GetConstraintsResults': {'additionalProperties': False,
++                                               'properties': {'constraints': {'$ref': '#/definitions/Value'}},
++                                               'required': ['constraints'],
++                                               'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'RemoteApplicationInfo': {'additionalProperties': False,
++                                               'properties': {'application-url': {'type': 'string'},
++                                                              'description': {'type': 'string'},
++                                                              'endpoints': {'items': {'$ref': '#/definitions/RemoteEndpoint'},
++                                                                            'type': 'array'},
++                                                              'icon-url-path': {'type': 'string'},
++                                                              'model-tag': {'type': 'string'},
++                                                              'name': {'type': 'string'},
++                                                              'source-model-label': {'type': 'string'}},
++                                               'required': ['model-tag',
++                                                            'name',
++                                                            'description',
++                                                            'application-url',
++                                                            'endpoints',
++                                                            'icon-url-path'],
++                                               'type': 'object'},
++                     'RemoteApplicationInfoResult': {'additionalProperties': False,
++                                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                    'result': {'$ref': '#/definitions/RemoteApplicationInfo'}},
++                                                     'type': 'object'},
++                     'RemoteApplicationInfoResults': {'additionalProperties': False,
++                                                      'properties': {'results': {'items': {'$ref': '#/definitions/RemoteApplicationInfoResult'},
++                                                                                 'type': 'array'}},
++                                                      'required': ['results'],
++                                                      'type': 'object'},
++                     'RemoteEndpoint': {'additionalProperties': False,
++                                        'properties': {'interface': {'type': 'string'},
++                                                       'limit': {'type': 'integer'},
++                                                       'name': {'type': 'string'},
++                                                       'role': {'type': 'string'},
++                                                       'scope': {'type': 'string'}},
++                                        'required': ['name',
++                                                     'role',
++                                                     'interface',
++                                                     'limit',
++                                                     'scope'],
++                                        'type': 'object'},
++                     'SetConstraints': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'constraints': {'$ref': '#/definitions/Value'}},
++                                        'required': ['application', 'constraints'],
++                                        'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddRelation': {'properties': {'Params': {'$ref': '#/definitions/AddRelation'},
++                                                   'Result': {'$ref': '#/definitions/AddRelationResults'}},
++                                    'type': 'object'},
++                    'AddUnits': {'properties': {'Params': {'$ref': '#/definitions/AddApplicationUnits'},
++                                                'Result': {'$ref': '#/definitions/AddApplicationUnitsResults'}},
++                                 'type': 'object'},
++                    'CharmRelations': {'properties': {'Params': {'$ref': '#/definitions/ApplicationCharmRelations'},
++                                                      'Result': {'$ref': '#/definitions/ApplicationCharmRelationsResults'}},
++                                       'type': 'object'},
++                    'Consume': {'properties': {'Params': {'$ref': '#/definitions/ConsumeApplicationArgs'},
++                                               'Result': {'$ref': '#/definitions/ConsumeApplicationResults'}},
++                                'type': 'object'},
++                    'Deploy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationsDeploy'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationDestroy'}},
++                                'type': 'object'},
++                    'DestroyApplication': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/DestroyApplicationResults'}},
++                                           'type': 'object'},
++                    'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}},
++                                        'type': 'object'},
++                    'DestroyUnit': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/DestroyUnitResults'}},
++                                    'type': 'object'},
++                    'DestroyUnits': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationUnits'}},
++                                     'type': 'object'},
++                    'Expose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationExpose'}},
++                               'type': 'object'},
++                    'Get': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                           'Result': {'$ref': '#/definitions/ApplicationGetResults'}},
++                            'type': 'object'},
++                    'GetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                                   'Result': {'$ref': '#/definitions/StringResult'}},
++                                    'type': 'object'},
++                    'GetConstraints': {'properties': {'Params': {'$ref': '#/definitions/GetApplicationConstraints'},
++                                                      'Result': {'$ref': '#/definitions/GetConstraintsResults'}},
++                                       'type': 'object'},
++                    'RemoteApplicationInfo': {'properties': {'Params': {'$ref': '#/definitions/ApplicationURLs'},
++                                                             'Result': {'$ref': '#/definitions/RemoteApplicationInfoResults'}},
++                                              'type': 'object'},
++                    'Set': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSet'}},
++                            'type': 'object'},
++                    'SetCharm': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharm'}},
++                                 'type': 'object'},
++                    'SetConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}},
++                                       'type': 'object'},
++                    'SetMetricCredentials': {'properties': {'Params': {'$ref': '#/definitions/ApplicationMetricCredentials'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'Unexpose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnexpose'}},
++                                 'type': 'object'},
++                    'Unset': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnset'}},
++                              'type': 'object'},
++                    'Update': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUpdate'}},
++                               'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddRelationResults)
++    async def AddRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddRelation', version=4, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddApplicationUnitsResults)
++    async def AddUnits(self, application, num_units, placement):
++        '''
++        application : str
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddUnits', version=4, params=_params)
++        _params['application'] = application
++        _params['num-units'] = num_units
++        _params['placement'] = placement
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationCharmRelationsResults)
++    async def CharmRelations(self, application):
++        '''
++        application : str
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='CharmRelations', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ConsumeApplicationResults)
++    async def Consume(self, args):
++        '''
++        args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg>
++        Returns -> typing.Sequence<+T_co>[~ConsumeApplicationResult]<~ConsumeApplicationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Consume', version=4, params=_params)
++        _params['args'] = args
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Deploy(self, applications):
++        '''
++        applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Deploy', version=4, params=_params)
++        _params['applications'] = applications
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Destroy(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Destroy', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyApplicationResults)
++    async def DestroyApplication(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyApplication', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyRelation', version=4, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyUnitResults)
++    async def DestroyUnit(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnit', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyUnits(self, unit_names):
++        '''
++        unit_names : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnits', version=4, params=_params)
++        _params['unit-names'] = unit_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Expose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Expose', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationGetResults)
++    async def Get(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Get', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def GetCharmURL(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetCharmURL', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetConstraintsResults)
++    async def GetConstraints(self, application):
++        '''
++        application : str
++        Returns -> Value
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetConstraints', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RemoteApplicationInfoResults)
++    async def RemoteApplicationInfo(self, application_urls):
++        '''
++        application_urls : typing.Sequence<+T_co>[str]
++        Returns -> typing.Sequence<+T_co>[~RemoteApplicationInfoResult]<~RemoteApplicationInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='RemoteApplicationInfo', version=4, params=_params)
++        _params['application-urls'] = application_urls
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Set(self, application, options):
++        '''
++        application : str
++        options : typing.Mapping<~KT, +VT_co>[str, str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Set', version=4, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetCharm(self, application, channel, charm_url, config_settings, config_settings_yaml, force_series, force_units, resource_ids, storage_constraints):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config_settings : typing.Mapping<~KT, +VT_co>[str, str]
++        config_settings_yaml : str
++        force_series : bool
++        force_units : bool
++        resource_ids : typing.Mapping<~KT, +VT_co>[str, str]
++        storage_constraints : typing.Mapping<~KT, +VT_co>[str, ~StorageConstraints]<~StorageConstraints>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetCharm', version=4, params=_params)
++        _params['application'] = application
++        _params['channel'] = channel
++        _params['charm-url'] = charm_url
++        _params['config-settings'] = config_settings
++        _params['config-settings-yaml'] = config_settings_yaml
++        _params['force-series'] = force_series
++        _params['force-units'] = force_units
++        _params['resource-ids'] = resource_ids
++        _params['storage-constraints'] = storage_constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetConstraints(self, application, constraints):
++        '''
++        application : str
++        constraints : Value
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetConstraints', version=4, params=_params)
++        _params['application'] = application
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMetricCredentials(self, creds):
++        '''
++        creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetMetricCredentials', version=4, params=_params)
++        _params['creds'] = creds
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unexpose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unexpose', version=4, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unset(self, application, options):
++        '''
++        application : str
++        options : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unset', version=4, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Update(self, application, charm_url, constraints, force_charm_url, force_series, min_units, settings, settings_yaml):
++        '''
++        application : str
++        charm_url : str
++        constraints : Value
++        force_charm_url : bool
++        force_series : bool
++        min_units : int
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        settings_yaml : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Update', version=4, params=_params)
++        _params['application'] = application
++        _params['charm-url'] = charm_url
++        _params['constraints'] = constraints
++        _params['force-charm-url'] = force_charm_url
++        _params['force-series'] = force_series
++        _params['min-units'] = min_units
++        _params['settings'] = settings
++        _params['settings-yaml'] = settings_yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UniterFacade(Type):
++    name = 'Uniter'
++    version = 4
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'Action': {'additionalProperties': False,
++                                'properties': {'name': {'type': 'string'},
++                                               'parameters': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                               'receiver': {'type': 'string'},
++                                               'tag': {'type': 'string'}},
++                                'required': ['tag', 'receiver', 'name'],
++                                'type': 'object'},
++                     'ActionExecutionResult': {'additionalProperties': False,
++                                               'properties': {'action-tag': {'type': 'string'},
++                                                              'message': {'type': 'string'},
++                                                              'results': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'},
++                                                              'status': {'type': 'string'}},
++                                               'required': ['action-tag', 'status'],
++                                               'type': 'object'},
++                     'ActionExecutionResults': {'additionalProperties': False,
++                                                'properties': {'results': {'items': {'$ref': '#/definitions/ActionExecutionResult'},
++                                                                           'type': 'array'}},
++                                                'type': 'object'},
++                     'ActionResult': {'additionalProperties': False,
++                                      'properties': {'action': {'$ref': '#/definitions/Action'},
++                                                     'completed': {'format': 'date-time',
++                                                                   'type': 'string'},
++                                                     'enqueued': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'message': {'type': 'string'},
++                                                     'output': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                             'type': 'object'}},
++                                                                'type': 'object'},
++                                                     'started': {'format': 'date-time',
++                                                                 'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'type': 'object'},
++                     'ActionResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'ApplicationStatusResult': {'additionalProperties': False,
++                                                 'properties': {'application': {'$ref': '#/definitions/StatusResult'},
++                                                                'error': {'$ref': '#/definitions/Error'},
++                                                                'units': {'patternProperties': {'.*': {'$ref': '#/definitions/StatusResult'}},
++                                                                          'type': 'object'}},
++                                                 'required': ['application',
++                                                              'units'],
++                                                 'type': 'object'},
++                     'ApplicationStatusResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationStatusResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'BoolResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'result': {'type': 'boolean'}},
++                                    'required': ['result'],
++                                    'type': 'object'},
++                     'BoolResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/BoolResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'CharmURL': {'additionalProperties': False,
++                                  'properties': {'url': {'type': 'string'}},
++                                  'required': ['url'],
++                                  'type': 'object'},
++                     'CharmURLs': {'additionalProperties': False,
++                                   'properties': {'urls': {'items': {'$ref': '#/definitions/CharmURL'},
++                                                           'type': 'array'}},
++                                   'required': ['urls'],
++                                   'type': 'object'},
++                     'ConfigSettingsResult': {'additionalProperties': False,
++                                              'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                             'settings': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'}},
++                                              'required': ['settings'],
++                                              'type': 'object'},
++                     'ConfigSettingsResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/ConfigSettingsResult'},
++                                                                          'type': 'array'}},
++                                               'required': ['results'],
++                                               'type': 'object'},
++                     'Endpoint': {'additionalProperties': False,
++                                  'properties': {'application-name': {'type': 'string'},
++                                                 'relation': {'$ref': '#/definitions/CharmRelation'}},
++                                  'required': ['application-name', 'relation'],
++                                  'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'EntitiesCharmURL': {'additionalProperties': False,
++                                          'properties': {'entities': {'items': {'$ref': '#/definitions/EntityCharmURL'},
++                                                                      'type': 'array'}},
++                                          'required': ['entities'],
++                                          'type': 'object'},
++                     'EntitiesPortRanges': {'additionalProperties': False,
++                                            'properties': {'entities': {'items': {'$ref': '#/definitions/EntityPortRange'},
++                                                                        'type': 'array'}},
++                                            'required': ['entities'],
++                                            'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityCharmURL': {'additionalProperties': False,
++                                        'properties': {'charm-url': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'charm-url'],
++                                        'type': 'object'},
++                     'EntityPortRange': {'additionalProperties': False,
++                                         'properties': {'from-port': {'type': 'integer'},
++                                                        'protocol': {'type': 'string'},
++                                                        'tag': {'type': 'string'},
++                                                        'to-port': {'type': 'integer'}},
++                                         'required': ['tag',
++                                                      'protocol',
++                                                      'from-port',
++                                                      'to-port'],
++                                         'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'EntityWorkloadVersion': {'additionalProperties': False,
++                                               'properties': {'tag': {'type': 'string'},
++                                                              'workload-version': {'type': 'string'}},
++                                               'required': ['tag',
++                                                            'workload-version'],
++                                               'type': 'object'},
++                     'EntityWorkloadVersions': {'additionalProperties': False,
++                                                'properties': {'entities': {'items': {'$ref': '#/definitions/EntityWorkloadVersion'},
++                                                                            'type': 'array'}},
++                                                'required': ['entities'],
++                                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetLeadershipSettingsBulkResults': {'additionalProperties': False,
++                                                          'properties': {'results': {'items': {'$ref': '#/definitions/GetLeadershipSettingsResult'},
++                                                                                     'type': 'array'}},
++                                                          'required': ['results'],
++                                                          'type': 'object'},
++                     'GetLeadershipSettingsResult': {'additionalProperties': False,
++                                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                    'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                 'type': 'object'}},
++                                                     'required': ['settings'],
++                                                     'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'IntResult': {'additionalProperties': False,
++                                   'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                  'result': {'type': 'integer'}},
++                                   'required': ['result'],
++                                   'type': 'object'},
++                     'IntResults': {'additionalProperties': False,
++                                    'properties': {'results': {'items': {'$ref': '#/definitions/IntResult'},
++                                                               'type': 'array'}},
++                                    'required': ['results'],
++                                    'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachinePortRange': {'additionalProperties': False,
++                                          'properties': {'port-range': {'$ref': '#/definitions/PortRange'},
++                                                         'relation-tag': {'type': 'string'},
++                                                         'unit-tag': {'type': 'string'}},
++                                          'required': ['unit-tag',
++                                                       'relation-tag',
++                                                       'port-range'],
++                                          'type': 'object'},
++                     'MachinePortsResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'ports': {'items': {'$ref': '#/definitions/MachinePortRange'},
++                                                                     'type': 'array'}},
++                                            'required': ['ports'],
++                                            'type': 'object'},
++                     'MachinePortsResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/MachinePortsResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'MergeLeadershipSettingsBulkParams': {'additionalProperties': False,
++                                                           'properties': {'params': {'items': {'$ref': '#/definitions/MergeLeadershipSettingsParam'},
++                                                                                     'type': 'array'}},
++                                                           'required': ['params'],
++                                                           'type': 'object'},
++                     'MergeLeadershipSettingsParam': {'additionalProperties': False,
++                                                      'properties': {'application-tag': {'type': 'string'},
++                                                                     'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                  'type': 'object'}},
++                                                      'required': ['application-tag',
++                                                                   'settings'],
++                                                      'type': 'object'},
++                     'MeterStatusResult': {'additionalProperties': False,
++                                           'properties': {'code': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'info': {'type': 'string'}},
++                                           'required': ['code', 'info'],
++                                           'type': 'object'},
++                     'MeterStatusResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/MeterStatusResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'Metric': {'additionalProperties': False,
++                                'properties': {'key': {'type': 'string'},
++                                               'time': {'format': 'date-time',
++                                                        'type': 'string'},
++                                               'value': {'type': 'string'}},
++                                'required': ['key', 'value', 'time'],
++                                'type': 'object'},
++                     'MetricBatch': {'additionalProperties': False,
++                                     'properties': {'charm-url': {'type': 'string'},
++                                                    'created': {'format': 'date-time',
++                                                                'type': 'string'},
++                                                    'metrics': {'items': {'$ref': '#/definitions/Metric'},
++                                                                'type': 'array'},
++                                                    'uuid': {'type': 'string'}},
++                                     'required': ['uuid',
++                                                  'charm-url',
++                                                  'created',
++                                                  'metrics'],
++                                     'type': 'object'},
++                     'MetricBatchParam': {'additionalProperties': False,
++                                          'properties': {'batch': {'$ref': '#/definitions/MetricBatch'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'batch'],
++                                          'type': 'object'},
++                     'MetricBatchParams': {'additionalProperties': False,
++                                           'properties': {'batches': {'items': {'$ref': '#/definitions/MetricBatchParam'},
++                                                                      'type': 'array'}},
++                                           'required': ['batches'],
++                                           'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'ModelResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                    'name': {'type': 'string'},
++                                                    'uuid': {'type': 'string'}},
++                                     'required': ['name', 'uuid'],
++                                     'type': 'object'},
++                     'NetworkConfig': {'additionalProperties': False,
++                                       'properties': {'address': {'type': 'string'},
++                                                      'cidr': {'type': 'string'},
++                                                      'config-type': {'type': 'string'},
++                                                      'device-index': {'type': 'integer'},
++                                                      'disabled': {'type': 'boolean'},
++                                                      'dns-search-domains': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                      'dns-servers': {'items': {'type': 'string'},
++                                                                      'type': 'array'},
++                                                      'gateway-address': {'type': 'string'},
++                                                      'interface-name': {'type': 'string'},
++                                                      'interface-type': {'type': 'string'},
++                                                      'mac-address': {'type': 'string'},
++                                                      'mtu': {'type': 'integer'},
++                                                      'no-auto-start': {'type': 'boolean'},
++                                                      'parent-interface-name': {'type': 'string'},
++                                                      'provider-address-id': {'type': 'string'},
++                                                      'provider-id': {'type': 'string'},
++                                                      'provider-space-id': {'type': 'string'},
++                                                      'provider-subnet-id': {'type': 'string'},
++                                                      'provider-vlan-id': {'type': 'string'},
++                                                      'routes': {'items': {'$ref': '#/definitions/NetworkRoute'},
++                                                                 'type': 'array'},
++                                                      'vlan-tag': {'type': 'integer'}},
++                                       'required': ['device-index',
++                                                    'mac-address',
++                                                    'cidr',
++                                                    'mtu',
++                                                    'provider-id',
++                                                    'provider-subnet-id',
++                                                    'provider-space-id',
++                                                    'provider-address-id',
++                                                    'provider-vlan-id',
++                                                    'vlan-tag',
++                                                    'interface-name',
++                                                    'parent-interface-name',
++                                                    'interface-type',
++                                                    'disabled'],
++                                       'type': 'object'},
++                     'NetworkRoute': {'additionalProperties': False,
++                                      'properties': {'destination-cidr': {'type': 'string'},
++                                                     'gateway-ip': {'type': 'string'},
++                                                     'metric': {'type': 'integer'}},
++                                      'required': ['destination-cidr',
++                                                   'gateway-ip',
++                                                   'metric'],
++                                      'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'PortRange': {'additionalProperties': False,
++                                   'properties': {'from-port': {'type': 'integer'},
++                                                  'protocol': {'type': 'string'},
++                                                  'to-port': {'type': 'integer'}},
++                                   'required': ['from-port', 'to-port', 'protocol'],
++                                   'type': 'object'},
++                     'RelationIds': {'additionalProperties': False,
++                                     'properties': {'relation-ids': {'items': {'type': 'integer'},
++                                                                     'type': 'array'}},
++                                     'required': ['relation-ids'],
++                                     'type': 'object'},
++                     'RelationResult': {'additionalProperties': False,
++                                        'properties': {'endpoint': {'$ref': '#/definitions/Endpoint'},
++                                                       'error': {'$ref': '#/definitions/Error'},
++                                                       'id': {'type': 'integer'},
++                                                       'key': {'type': 'string'},
++                                                       'life': {'type': 'string'}},
++                                        'required': ['life',
++                                                     'id',
++                                                     'key',
++                                                     'endpoint'],
++                                        'type': 'object'},
++                     'RelationResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/RelationResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'},
++                     'RelationUnit': {'additionalProperties': False,
++                                      'properties': {'relation': {'type': 'string'},
++                                                     'unit': {'type': 'string'}},
++                                      'required': ['relation', 'unit'],
++                                      'type': 'object'},
++                     'RelationUnitPair': {'additionalProperties': False,
++                                          'properties': {'local-unit': {'type': 'string'},
++                                                         'relation': {'type': 'string'},
++                                                         'remote-unit': {'type': 'string'}},
++                                          'required': ['relation',
++                                                       'local-unit',
++                                                       'remote-unit'],
++                                          'type': 'object'},
++                     'RelationUnitPairs': {'additionalProperties': False,
++                                           'properties': {'relation-unit-pairs': {'items': {'$ref': '#/definitions/RelationUnitPair'},
++                                                                                  'type': 'array'}},
++                                           'required': ['relation-unit-pairs'],
++                                           'type': 'object'},
++                     'RelationUnitSettings': {'additionalProperties': False,
++                                              'properties': {'relation': {'type': 'string'},
++                                                             'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                          'type': 'object'},
++                                                             'unit': {'type': 'string'}},
++                                              'required': ['relation',
++                                                           'unit',
++                                                           'settings'],
++                                              'type': 'object'},
++                     'RelationUnits': {'additionalProperties': False,
++                                       'properties': {'relation-units': {'items': {'$ref': '#/definitions/RelationUnit'},
++                                                                         'type': 'array'}},
++                                       'required': ['relation-units'],
++                                       'type': 'object'},
++                     'RelationUnitsChange': {'additionalProperties': False,
++                                             'properties': {'changed': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitSettings'}},
++                                                                        'type': 'object'},
++                                                            'departed': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                             'required': ['changed'],
++                                             'type': 'object'},
++                     'RelationUnitsSettings': {'additionalProperties': False,
++                                               'properties': {'relation-units': {'items': {'$ref': '#/definitions/RelationUnitSettings'},
++                                                                                 'type': 'array'}},
++                                               'required': ['relation-units'],
++                                               'type': 'object'},
++                     'RelationUnitsWatchResult': {'additionalProperties': False,
++                                                  'properties': {'changes': {'$ref': '#/definitions/RelationUnitsChange'},
++                                                                 'error': {'$ref': '#/definitions/Error'},
++                                                                 'watcher-id': {'type': 'string'}},
++                                                  'required': ['watcher-id',
++                                                               'changes'],
++                                                  'type': 'object'},
++                     'RelationUnitsWatchResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/RelationUnitsWatchResult'},
++                                                                              'type': 'array'}},
++                                                   'required': ['results'],
++                                                   'type': 'object'},
++                     'ResolvedModeResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'mode': {'type': 'string'}},
++                                            'required': ['mode'],
++                                            'type': 'object'},
++                     'ResolvedModeResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/ResolvedModeResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'SettingsResult': {'additionalProperties': False,
++                                        'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                       'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                    'type': 'object'}},
++                                        'required': ['settings'],
++                                        'type': 'object'},
++                     'SettingsResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/SettingsResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'},
++                     'StatusResult': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'id': {'type': 'string'},
++                                                     'info': {'type': 'string'},
++                                                     'life': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['id',
++                                                   'life',
++                                                   'status',
++                                                   'info',
++                                                   'data',
++                                                   'since'],
++                                      'type': 'object'},
++                     'StatusResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StatusResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StorageAddParams': {'additionalProperties': False,
++                                          'properties': {'name': {'type': 'string'},
++                                                         'storage': {'$ref': '#/definitions/StorageConstraints'},
++                                                         'unit': {'type': 'string'}},
++                                          'required': ['unit', 'name', 'storage'],
++                                          'type': 'object'},
++                     'StorageAttachment': {'additionalProperties': False,
++                                           'properties': {'kind': {'type': 'integer'},
++                                                          'life': {'type': 'string'},
++                                                          'location': {'type': 'string'},
++                                                          'owner-tag': {'type': 'string'},
++                                                          'storage-tag': {'type': 'string'},
++                                                          'unit-tag': {'type': 'string'}},
++                                           'required': ['storage-tag',
++                                                        'owner-tag',
++                                                        'unit-tag',
++                                                        'kind',
++                                                        'location',
++                                                        'life'],
++                                           'type': 'object'},
++                     'StorageAttachmentId': {'additionalProperties': False,
++                                             'properties': {'storage-tag': {'type': 'string'},
++                                                            'unit-tag': {'type': 'string'}},
++                                             'required': ['storage-tag',
++                                                          'unit-tag'],
++                                             'type': 'object'},
++                     'StorageAttachmentIds': {'additionalProperties': False,
++                                              'properties': {'ids': {'items': {'$ref': '#/definitions/StorageAttachmentId'},
++                                                                     'type': 'array'}},
++                                              'required': ['ids'],
++                                              'type': 'object'},
++                     'StorageAttachmentIdsResult': {'additionalProperties': False,
++                                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                   'result': {'$ref': '#/definitions/StorageAttachmentIds'}},
++                                                    'required': ['result'],
++                                                    'type': 'object'},
++                     'StorageAttachmentIdsResults': {'additionalProperties': False,
++                                                     'properties': {'results': {'items': {'$ref': '#/definitions/StorageAttachmentIdsResult'},
++                                                                                'type': 'array'}},
++                                                     'type': 'object'},
++                     'StorageAttachmentResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'result': {'$ref': '#/definitions/StorageAttachment'}},
++                                                 'required': ['result'],
++                                                 'type': 'object'},
++                     'StorageAttachmentResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/StorageAttachmentResult'},
++                                                                             'type': 'array'}},
++                                                  'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StoragesAddParams': {'additionalProperties': False,
++                                           'properties': {'storages': {'items': {'$ref': '#/definitions/StorageAddParams'},
++                                                                       'type': 'array'}},
++                                           'required': ['storages'],
++                                           'type': 'object'},
++                     'StringBoolResult': {'additionalProperties': False,
++                                          'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                         'ok': {'type': 'boolean'},
++                                                         'result': {'type': 'string'}},
++                                          'required': ['result', 'ok'],
++                                          'type': 'object'},
++                     'StringBoolResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/StringBoolResult'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'UnitNetworkConfig': {'additionalProperties': False,
++                                           'properties': {'binding-name': {'type': 'string'},
++                                                          'unit-tag': {'type': 'string'}},
++                                           'required': ['unit-tag', 'binding-name'],
++                                           'type': 'object'},
++                     'UnitNetworkConfigResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'info': {'items': {'$ref': '#/definitions/NetworkConfig'},
++                                                                         'type': 'array'}},
++                                                 'required': ['info'],
++                                                 'type': 'object'},
++                     'UnitNetworkConfigResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/UnitNetworkConfigResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'UnitSettings': {'additionalProperties': False,
++                                      'properties': {'version': {'type': 'integer'}},
++                                      'required': ['version'],
++                                      'type': 'object'},
++                     'UnitsNetworkConfig': {'additionalProperties': False,
++                                            'properties': {'args': {'items': {'$ref': '#/definitions/UnitNetworkConfig'},
++                                                                    'type': 'array'}},
++                                            'required': ['args'],
++                                            'type': 'object'}},
++     'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                     'type': 'object'},
++                    'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'Actions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ActionResults'}},
++                                'type': 'object'},
++                    'AddMetricBatches': {'properties': {'Params': {'$ref': '#/definitions/MetricBatchParams'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'},
++                    'AddUnitStorage': {'properties': {'Params': {'$ref': '#/definitions/StoragesAddParams'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'AllMachinePorts': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/MachinePortsResults'}},
++                                        'type': 'object'},
++                    'ApplicationStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/ApplicationStatusResults'}},
++                                          'type': 'object'},
++                    'AssignedMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringResults'}},
++                                        'type': 'object'},
++                    'AvailabilityZone': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/StringResults'}},
++                                         'type': 'object'},
++                    'BeginActions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'CharmArchiveSha256': {'properties': {'Params': {'$ref': '#/definitions/CharmURLs'},
++                                                          'Result': {'$ref': '#/definitions/StringResults'}},
++                                           'type': 'object'},
++                    'CharmModifiedVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                            'Result': {'$ref': '#/definitions/IntResults'}},
++                                             'type': 'object'},
++                    'CharmURL': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                'Result': {'$ref': '#/definitions/StringBoolResults'}},
++                                 'type': 'object'},
++                    'ClearResolved': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'ClosePorts': {'properties': {'Params': {'$ref': '#/definitions/EntitiesPortRanges'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'ConfigSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/ConfigSettingsResults'}},
++                                       'type': 'object'},
++                    'CurrentModel': {'properties': {'Result': {'$ref': '#/definitions/ModelResult'}},
++                                     'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'DestroyAllSubordinates': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'},
++                    'DestroyUnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                      'type': 'object'},
++                    'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'EnterScope': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'FinishActions': {'properties': {'Params': {'$ref': '#/definitions/ActionExecutionResults'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'GetMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/MeterStatusResults'}},
++                                       'type': 'object'},
++                    'GetPrincipal': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/StringBoolResults'}},
++                                     'type': 'object'},
++                    'HasSubordinates': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/BoolResults'}},
++                                        'type': 'object'},
++                    'JoinedRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringsResults'}},
++                                        'type': 'object'},
++                    'LeaveScope': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'Merge': {'properties': {'Params': {'$ref': '#/definitions/MergeLeadershipSettingsBulkParams'},
++                                             'Result': {'$ref': '#/definitions/ErrorResults'}},
++                              'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                  'type': 'object'},
++                    'NetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/UnitsNetworkConfig'},
++                                                     'Result': {'$ref': '#/definitions/UnitNetworkConfigResults'}},
++                                      'type': 'object'},
++                    'OpenPorts': {'properties': {'Params': {'$ref': '#/definitions/EntitiesPortRanges'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'PrivateAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StringResults'}},
++                                       'type': 'object'},
++                    'ProviderType': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                     'type': 'object'},
++                    'PublicAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/StringResults'}},
++                                      'type': 'object'},
++                    'Read': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/GetLeadershipSettingsBulkResults'}},
++                             'type': 'object'},
++                    'ReadRemoteSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnitPairs'},
++                                                          'Result': {'$ref': '#/definitions/SettingsResults'}},
++                                           'type': 'object'},
++                    'ReadSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                    'Result': {'$ref': '#/definitions/SettingsResults'}},
++                                     'type': 'object'},
++                    'Relation': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                'Result': {'$ref': '#/definitions/RelationResults'}},
++                                 'type': 'object'},
++                    'RelationById': {'properties': {'Params': {'$ref': '#/definitions/RelationIds'},
++                                                    'Result': {'$ref': '#/definitions/RelationResults'}},
++                                     'type': 'object'},
++                    'RemoveStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                                'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                 'type': 'object'},
++                    'RequestReboot': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'Resolved': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                'Result': {'$ref': '#/definitions/ResolvedModeResults'}},
++                                 'type': 'object'},
++                    'SetAgentStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'SetApplicationStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'SetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/EntitiesCharmURL'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'SetUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'SetWorkloadVersion': {'properties': {'Params': {'$ref': '#/definitions/EntityWorkloadVersions'},
++                                                          'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                           'type': 'object'},
++                    'StorageAttachmentLife': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                             'Result': {'$ref': '#/definitions/LifeResults'}},
++                                              'type': 'object'},
++                    'StorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                          'Result': {'$ref': '#/definitions/StorageAttachmentResults'}},
++                                           'type': 'object'},
++                    'UnitStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StatusResults'}},
++                                   'type': 'object'},
++                    'UnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/StorageAttachmentIdsResults'}},
++                                               'type': 'object'},
++                    'UpdateSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnitsSettings'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'},
++                    'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                          'type': 'object'},
++                    'WatchActionNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                 'type': 'object'},
++                    'WatchApplicationRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                 'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                  'type': 'object'},
++                    'WatchConfigSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                           'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                            'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'},
++                    'WatchLeadershipSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                               'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                                'type': 'object'},
++                    'WatchMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                         'type': 'object'},
++                    'WatchRelationUnits': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                          'Result': {'$ref': '#/definitions/RelationUnitsWatchResults'}},
++                                           'type': 'object'},
++                    'WatchStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                               'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                                'type': 'object'},
++                    'WatchUnitAddresses': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                           'type': 'object'},
++                    'WatchUnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                   'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                    'type': 'object'},
++                    'WorkloadVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringResults'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResult)
++    async def APIAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='APIAddresses', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='APIHostPorts', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def Actions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Actions', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def AddMetricBatches(self, batches):
++        '''
++        batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AddMetricBatches', version=4, params=_params)
++        _params['batches'] = batches
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def AddUnitStorage(self, storages):
++        '''
++        storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AddUnitStorage', version=4, params=_params)
++        _params['storages'] = storages
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachinePortsResults)
++    async def AllMachinePorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AllMachinePorts', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationStatusResults)
++    async def ApplicationStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ApplicationStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def AssignedMachine(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AssignedMachine', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def AvailabilityZone(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AvailabilityZone', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def BeginActions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='BeginActions', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CACert', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def CharmArchiveSha256(self, urls):
++        '''
++        urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmArchiveSha256', version=4, params=_params)
++        _params['urls'] = urls
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(IntResults)
++    async def CharmModifiedVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~IntResult]<~IntResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmModifiedVersion', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringBoolResults)
++    async def CharmURL(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmURL', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ClearResolved(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ClearResolved', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ClosePorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ClosePorts', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ConfigSettingsResults)
++    async def ConfigSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ConfigSettings', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelResult)
++    async def CurrentModel(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CurrentModel', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Destroy(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Destroy', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyAllSubordinates(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='DestroyAllSubordinates', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyUnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='DestroyUnitStorageAttachments', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnsureDead(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='EnsureDead', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnterScope(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='EnterScope', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def FinishActions(self, results):
++        '''
++        results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='FinishActions', version=4, params=_params)
++        _params['results'] = results
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MeterStatusResults)
++    async def GetMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='GetMeterStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringBoolResults)
++    async def GetPrincipal(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='GetPrincipal', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BoolResults)
++    async def HasSubordinates(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='HasSubordinates', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResults)
++    async def JoinedRelations(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='JoinedRelations', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def LeaveScope(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='LeaveScope', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Life', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Merge(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Merge', version=4, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ModelConfig', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ModelUUID(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ModelUUID', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(UnitNetworkConfigResults)
++    async def NetworkConfig(self, args):
++        '''
++        args : typing.Sequence<+T_co>[~UnitNetworkConfig]<~UnitNetworkConfig>
++        Returns -> typing.Sequence<+T_co>[~UnitNetworkConfigResult]<~UnitNetworkConfigResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='NetworkConfig', version=4, params=_params)
++        _params['args'] = args
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def OpenPorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='OpenPorts', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def PrivateAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='PrivateAddress', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ProviderType(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ProviderType', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def PublicAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='PublicAddress', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetLeadershipSettingsBulkResults)
++    async def Read(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Read', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SettingsResults)
++    async def ReadRemoteSettings(self, relation_unit_pairs):
++        '''
++        relation_unit_pairs : typing.Sequence<+T_co>[~RelationUnitPair]<~RelationUnitPair>
++        Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ReadRemoteSettings', version=4, params=_params)
++        _params['relation-unit-pairs'] = relation_unit_pairs
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SettingsResults)
++    async def ReadSettings(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ReadSettings', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationResults)
++    async def Relation(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Relation', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationResults)
++    async def RelationById(self, relation_ids):
++        '''
++        relation_ids : typing.Sequence<+T_co>[int]
++        Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RelationById', version=4, params=_params)
++        _params['relation-ids'] = relation_ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RemoveStorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RemoveStorageAttachments', version=4, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RequestReboot(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RequestReboot', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ResolvedModeResults)
++    async def Resolved(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Resolved', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetAgentStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetAgentStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetApplicationStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetApplicationStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetCharmURL(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetCharmURL', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetUnitStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetUnitStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetWorkloadVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetWorkloadVersion', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def StorageAttachmentLife(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='StorageAttachmentLife', version=4, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageAttachmentResults)
++    async def StorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='StorageAttachments', version=4, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def UnitStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UnitStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageAttachmentIdsResults)
++    async def UnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UnitStorageAttachments', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateSettings(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UpdateSettings', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Watch', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchAPIHostPorts(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchAPIHostPorts', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchActionNotifications(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchActionNotifications', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchApplicationRelations(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchApplicationRelations', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchConfigSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchConfigSettings', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchForModelConfigChanges', version=4, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchLeadershipSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchLeadershipSettings', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchMeterStatus', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationUnitsWatchResults)
++    async def WatchRelationUnits(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchRelationUnits', version=4, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchStorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchStorageAttachments', version=4, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchUnitAddresses(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchUnitAddresses', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchUnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchUnitStorageAttachments', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def WorkloadVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WorkloadVersion', version=4, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
index 0000000,0000000..22805ed
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2654 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++from juju.client._definitions import *
++
++
++class ApplicationFacade(Type):
++    name = 'Application'
++    version = 5
++    schema =     {'definitions': {'AddApplicationUnits': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'attach-storage': {'items': {'type': 'string'},
++                                                                               'type': 'array'},
++                                                            'num-units': {'type': 'integer'},
++                                                            'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                          'type': 'array'}},
++                                             'required': ['application',
++                                                          'num-units',
++                                                          'placement'],
++                                             'type': 'object'},
++                     'AddApplicationUnitsResults': {'additionalProperties': False,
++                                                    'properties': {'units': {'items': {'type': 'string'},
++                                                                             'type': 'array'}},
++                                                    'required': ['units'],
++                                                    'type': 'object'},
++                     'AddRelation': {'additionalProperties': False,
++                                     'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                  'type': 'array'}},
++                                     'required': ['endpoints'],
++                                     'type': 'object'},
++                     'AddRelationResults': {'additionalProperties': False,
++                                            'properties': {'endpoints': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmRelation'}},
++                                                                         'type': 'object'}},
++                                            'required': ['endpoints'],
++                                            'type': 'object'},
++                     'ApplicationCharmRelations': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'ApplicationCharmRelationsResults': {'additionalProperties': False,
++                                                          'properties': {'charm-relations': {'items': {'type': 'string'},
++                                                                                             'type': 'array'}},
++                                                          'required': ['charm-relations'],
++                                                          'type': 'object'},
++                     'ApplicationDeploy': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'attach-storage': {'items': {'type': 'string'},
++                                                                             'type': 'array'},
++                                                          'channel': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'config': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                     'type': 'object'},
++                                                          'config-yaml': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                          'num-units': {'type': 'integer'},
++                                                          'placement': {'items': {'$ref': '#/definitions/Placement'},
++                                                                        'type': 'array'},
++                                                          'resources': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                        'type': 'object'},
++                                                          'series': {'type': 'string'},
++                                                          'storage': {'patternProperties': {'.*': {'$ref': '#/definitions/Constraints'}},
++                                                                      'type': 'object'}},
++                                           'required': ['application',
++                                                        'series',
++                                                        'charm-url',
++                                                        'channel',
++                                                        'num-units',
++                                                        'config-yaml',
++                                                        'constraints'],
++                                           'type': 'object'},
++                     'ApplicationDestroy': {'additionalProperties': False,
++                                            'properties': {'application': {'type': 'string'}},
++                                            'required': ['application'],
++                                            'type': 'object'},
++                     'ApplicationExpose': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'}},
++                                           'required': ['application'],
++                                           'type': 'object'},
++                     'ApplicationGet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'}},
++                                        'required': ['application'],
++                                        'type': 'object'},
++                     'ApplicationGetResults': {'additionalProperties': False,
++                                               'properties': {'application': {'type': 'string'},
++                                                              'charm': {'type': 'string'},
++                                                              'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                      'type': 'object'}},
++                                                                         'type': 'object'},
++                                                              'constraints': {'$ref': '#/definitions/Value'},
++                                                              'series': {'type': 'string'}},
++                                               'required': ['application',
++                                                            'charm',
++                                                            'config',
++                                                            'constraints',
++                                                            'series'],
++                                               'type': 'object'},
++                     'ApplicationMetricCredential': {'additionalProperties': False,
++                                                     'properties': {'application': {'type': 'string'},
++                                                                    'metrics-credentials': {'items': {'type': 'integer'},
++                                                                                            'type': 'array'}},
++                                                     'required': ['application',
++                                                                  'metrics-credentials'],
++                                                     'type': 'object'},
++                     'ApplicationMetricCredentials': {'additionalProperties': False,
++                                                      'properties': {'creds': {'items': {'$ref': '#/definitions/ApplicationMetricCredential'},
++                                                                               'type': 'array'}},
++                                                      'required': ['creds'],
++                                                      'type': 'object'},
++                     'ApplicationOffer': {'additionalProperties': False,
++                                          'properties': {'access': {'type': 'string'},
++                                                         'application-description': {'type': 'string'},
++                                                         'bindings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                      'type': 'object'},
++                                                         'endpoints': {'items': {'$ref': '#/definitions/RemoteEndpoint'},
++                                                                       'type': 'array'},
++                                                         'offer-name': {'type': 'string'},
++                                                         'offer-url': {'type': 'string'},
++                                                         'source-model-tag': {'type': 'string'},
++                                                         'spaces': {'items': {'$ref': '#/definitions/RemoteSpace'},
++                                                                    'type': 'array'}},
++                                          'required': ['source-model-tag',
++                                                       'offer-url',
++                                                       'offer-name',
++                                                       'application-description',
++                                                       'endpoints',
++                                                       'spaces',
++                                                       'bindings',
++                                                       'access'],
++                                          'type': 'object'},
++                     'ApplicationSet': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'options': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                   'type': 'object'}},
++                                        'required': ['application', 'options'],
++                                        'type': 'object'},
++                     'ApplicationSetCharm': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'},
++                                                            'channel': {'type': 'string'},
++                                                            'charm-url': {'type': 'string'},
++                                                            'config-settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                'type': 'object'},
++                                                            'config-settings-yaml': {'type': 'string'},
++                                                            'force-series': {'type': 'boolean'},
++                                                            'force-units': {'type': 'boolean'},
++                                                            'resource-ids': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                             'type': 'object'},
++                                                            'storage-constraints': {'patternProperties': {'.*': {'$ref': '#/definitions/StorageConstraints'}},
++                                                                                    'type': 'object'}},
++                                             'required': ['application',
++                                                          'charm-url',
++                                                          'channel',
++                                                          'force-units',
++                                                          'force-series'],
++                                             'type': 'object'},
++                     'ApplicationUnexpose': {'additionalProperties': False,
++                                             'properties': {'application': {'type': 'string'}},
++                                             'required': ['application'],
++                                             'type': 'object'},
++                     'ApplicationUnset': {'additionalProperties': False,
++                                          'properties': {'application': {'type': 'string'},
++                                                         'options': {'items': {'type': 'string'},
++                                                                     'type': 'array'}},
++                                          'required': ['application', 'options'],
++                                          'type': 'object'},
++                     'ApplicationUpdate': {'additionalProperties': False,
++                                           'properties': {'application': {'type': 'string'},
++                                                          'charm-url': {'type': 'string'},
++                                                          'constraints': {'$ref': '#/definitions/Value'},
++                                                          'force-charm-url': {'type': 'boolean'},
++                                                          'force-series': {'type': 'boolean'},
++                                                          'min-units': {'type': 'integer'},
++                                                          'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                       'type': 'object'},
++                                                          'settings-yaml': {'type': 'string'}},
++                                           'required': ['application',
++                                                        'charm-url',
++                                                        'force-charm-url',
++                                                        'force-series',
++                                                        'settings-yaml'],
++                                           'type': 'object'},
++                     'ApplicationsDeploy': {'additionalProperties': False,
++                                            'properties': {'applications': {'items': {'$ref': '#/definitions/ApplicationDeploy'},
++                                                                            'type': 'array'}},
++                                            'required': ['applications'],
++                                            'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'Constraints': {'additionalProperties': False,
++                                     'properties': {'Count': {'type': 'integer'},
++                                                    'Pool': {'type': 'string'},
++                                                    'Size': {'type': 'integer'}},
++                                     'required': ['Pool', 'Size', 'Count'],
++                                     'type': 'object'},
++                     'ConsumeApplicationArg': {'additionalProperties': False,
++                                               'properties': {'ApplicationOffer': {'$ref': '#/definitions/ApplicationOffer'},
++                                                              'application-alias': {'type': 'string'},
++                                                              'macaroon': {'$ref': '#/definitions/Macaroon'}},
++                                               'required': ['ApplicationOffer'],
++                                               'type': 'object'},
++                     'ConsumeApplicationArgs': {'additionalProperties': False,
++                                                'properties': {'args': {'items': {'$ref': '#/definitions/ConsumeApplicationArg'},
++                                                                        'type': 'array'}},
++                                                'type': 'object'},
++                     'DestroyApplicationInfo': {'additionalProperties': False,
++                                                'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                     'type': 'array'},
++                                                               'destroyed-units': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                   'type': 'array'},
++                                                               'detached-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                                    'type': 'array'}},
++                                                'type': 'object'},
++                     'DestroyApplicationResult': {'additionalProperties': False,
++                                                  'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                 'info': {'$ref': '#/definitions/DestroyApplicationInfo'}},
++                                                  'type': 'object'},
++                     'DestroyApplicationResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/DestroyApplicationResult'},
++                                                                              'type': 'array'}},
++                                                   'type': 'object'},
++                     'DestroyApplicationUnits': {'additionalProperties': False,
++                                                 'properties': {'unit-names': {'items': {'type': 'string'},
++                                                                               'type': 'array'}},
++                                                 'required': ['unit-names'],
++                                                 'type': 'object'},
++                     'DestroyRelation': {'additionalProperties': False,
++                                         'properties': {'endpoints': {'items': {'type': 'string'},
++                                                                      'type': 'array'}},
++                                         'required': ['endpoints'],
++                                         'type': 'object'},
++                     'DestroyUnitInfo': {'additionalProperties': False,
++                                         'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                              'type': 'array'},
++                                                        'detached-storage': {'items': {'$ref': '#/definitions/Entity'},
++                                                                             'type': 'array'}},
++                                         'type': 'object'},
++                     'DestroyUnitResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'info': {'$ref': '#/definitions/DestroyUnitInfo'}},
++                                           'type': 'object'},
++                     'DestroyUnitResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/DestroyUnitResult'},
++                                                                       'type': 'array'}},
++                                            'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetApplicationConstraints': {'additionalProperties': False,
++                                                   'properties': {'application': {'type': 'string'}},
++                                                   'required': ['application'],
++                                                   'type': 'object'},
++                     'GetConstraintsResults': {'additionalProperties': False,
++                                               'properties': {'constraints': {'$ref': '#/definitions/Value'}},
++                                               'required': ['constraints'],
++                                               'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'Placement': {'additionalProperties': False,
++                                   'properties': {'directive': {'type': 'string'},
++                                                  'scope': {'type': 'string'}},
++                                   'required': ['scope', 'directive'],
++                                   'type': 'object'},
++                     'RemoteEndpoint': {'additionalProperties': False,
++                                        'properties': {'interface': {'type': 'string'},
++                                                       'limit': {'type': 'integer'},
++                                                       'name': {'type': 'string'},
++                                                       'role': {'type': 'string'},
++                                                       'scope': {'type': 'string'}},
++                                        'required': ['name',
++                                                     'role',
++                                                     'interface',
++                                                     'limit',
++                                                     'scope'],
++                                        'type': 'object'},
++                     'RemoteSpace': {'additionalProperties': False,
++                                     'properties': {'cloud-type': {'type': 'string'},
++                                                    'name': {'type': 'string'},
++                                                    'provider-attributes': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                         'type': 'object'}},
++                                                                            'type': 'object'},
++                                                    'provider-id': {'type': 'string'},
++                                                    'subnets': {'items': {'$ref': '#/definitions/Subnet'},
++                                                                'type': 'array'}},
++                                     'required': ['cloud-type',
++                                                  'name',
++                                                  'provider-id',
++                                                  'provider-attributes',
++                                                  'subnets'],
++                                     'type': 'object'},
++                     'SetConstraints': {'additionalProperties': False,
++                                        'properties': {'application': {'type': 'string'},
++                                                       'constraints': {'$ref': '#/definitions/Value'}},
++                                        'required': ['application', 'constraints'],
++                                        'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'Subnet': {'additionalProperties': False,
++                                'properties': {'cidr': {'type': 'string'},
++                                               'life': {'type': 'string'},
++                                               'provider-id': {'type': 'string'},
++                                               'provider-network-id': {'type': 'string'},
++                                               'provider-space-id': {'type': 'string'},
++                                               'space-tag': {'type': 'string'},
++                                               'status': {'type': 'string'},
++                                               'vlan-tag': {'type': 'integer'},
++                                               'zones': {'items': {'type': 'string'},
++                                                         'type': 'array'}},
++                                'required': ['cidr',
++                                             'vlan-tag',
++                                             'life',
++                                             'space-tag',
++                                             'zones'],
++                                'type': 'object'},
++                     'Value': {'additionalProperties': False,
++                               'properties': {'arch': {'type': 'string'},
++                                              'container': {'type': 'string'},
++                                              'cores': {'type': 'integer'},
++                                              'cpu-power': {'type': 'integer'},
++                                              'instance-type': {'type': 'string'},
++                                              'mem': {'type': 'integer'},
++                                              'root-disk': {'type': 'integer'},
++                                              'spaces': {'items': {'type': 'string'},
++                                                         'type': 'array'},
++                                              'tags': {'items': {'type': 'string'},
++                                                       'type': 'array'},
++                                              'virt-type': {'type': 'string'}},
++                               'type': 'object'}},
++     'properties': {'AddRelation': {'properties': {'Params': {'$ref': '#/definitions/AddRelation'},
++                                                   'Result': {'$ref': '#/definitions/AddRelationResults'}},
++                                    'type': 'object'},
++                    'AddUnits': {'properties': {'Params': {'$ref': '#/definitions/AddApplicationUnits'},
++                                                'Result': {'$ref': '#/definitions/AddApplicationUnitsResults'}},
++                                 'type': 'object'},
++                    'CharmRelations': {'properties': {'Params': {'$ref': '#/definitions/ApplicationCharmRelations'},
++                                                      'Result': {'$ref': '#/definitions/ApplicationCharmRelationsResults'}},
++                                       'type': 'object'},
++                    'Consume': {'properties': {'Params': {'$ref': '#/definitions/ConsumeApplicationArgs'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'Deploy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationsDeploy'},
++                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                               'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationDestroy'}},
++                                'type': 'object'},
++                    'DestroyApplication': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/DestroyApplicationResults'}},
++                                           'type': 'object'},
++                    'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}},
++                                        'type': 'object'},
++                    'DestroyUnit': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                   'Result': {'$ref': '#/definitions/DestroyUnitResults'}},
++                                    'type': 'object'},
++                    'DestroyUnits': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationUnits'}},
++                                     'type': 'object'},
++                    'Expose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationExpose'}},
++                               'type': 'object'},
++                    'Get': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                           'Result': {'$ref': '#/definitions/ApplicationGetResults'}},
++                            'type': 'object'},
++                    'GetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/ApplicationGet'},
++                                                   'Result': {'$ref': '#/definitions/StringResult'}},
++                                    'type': 'object'},
++                    'GetConstraints': {'properties': {'Params': {'$ref': '#/definitions/GetApplicationConstraints'},
++                                                      'Result': {'$ref': '#/definitions/GetConstraintsResults'}},
++                                       'type': 'object'},
++                    'Set': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSet'}},
++                            'type': 'object'},
++                    'SetCharm': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharm'}},
++                                 'type': 'object'},
++                    'SetConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}},
++                                       'type': 'object'},
++                    'SetMetricCredentials': {'properties': {'Params': {'$ref': '#/definitions/ApplicationMetricCredentials'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'Unexpose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnexpose'}},
++                                 'type': 'object'},
++                    'Unset': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnset'}},
++                              'type': 'object'},
++                    'Update': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUpdate'}},
++                               'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(AddRelationResults)
++    async def AddRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddRelation', version=5, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(AddApplicationUnitsResults)
++    async def AddUnits(self, application, num_units, placement):
++        '''
++        application : str
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='AddUnits', version=5, params=_params)
++        _params['application'] = application
++        _params['num-units'] = num_units
++        _params['placement'] = placement
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationCharmRelationsResults)
++    async def CharmRelations(self, application):
++        '''
++        application : str
++        Returns -> typing.Sequence<+T_co>[str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='CharmRelations', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Consume(self, args):
++        '''
++        args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Consume', version=5, params=_params)
++        _params['args'] = args
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Deploy(self, applications):
++        '''
++        applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Deploy', version=5, params=_params)
++        _params['applications'] = applications
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Destroy(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Destroy', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyApplicationResults)
++    async def DestroyApplication(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyApplication', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyRelation(self, endpoints):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyRelation', version=5, params=_params)
++        _params['endpoints'] = endpoints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(DestroyUnitResults)
++    async def DestroyUnit(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnit', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def DestroyUnits(self, unit_names):
++        '''
++        unit_names : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='DestroyUnits', version=5, params=_params)
++        _params['unit-names'] = unit_names
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Expose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Expose', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationGetResults)
++    async def Get(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Get', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def GetCharmURL(self, application):
++        '''
++        application : str
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetCharmURL', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetConstraintsResults)
++    async def GetConstraints(self, application):
++        '''
++        application : str
++        Returns -> Value
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='GetConstraints', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Set(self, application, options):
++        '''
++        application : str
++        options : typing.Mapping<~KT, +VT_co>[str, str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Set', version=5, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetCharm(self, application, channel, charm_url, config_settings, config_settings_yaml, force_series, force_units, resource_ids, storage_constraints):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config_settings : typing.Mapping<~KT, +VT_co>[str, str]
++        config_settings_yaml : str
++        force_series : bool
++        force_units : bool
++        resource_ids : typing.Mapping<~KT, +VT_co>[str, str]
++        storage_constraints : typing.Mapping<~KT, +VT_co>[str, ~StorageConstraints]<~StorageConstraints>
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetCharm', version=5, params=_params)
++        _params['application'] = application
++        _params['channel'] = channel
++        _params['charm-url'] = charm_url
++        _params['config-settings'] = config_settings
++        _params['config-settings-yaml'] = config_settings_yaml
++        _params['force-series'] = force_series
++        _params['force-units'] = force_units
++        _params['resource-ids'] = resource_ids
++        _params['storage-constraints'] = storage_constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def SetConstraints(self, application, constraints):
++        '''
++        application : str
++        constraints : Value
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetConstraints', version=5, params=_params)
++        _params['application'] = application
++        _params['constraints'] = constraints
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetMetricCredentials(self, creds):
++        '''
++        creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='SetMetricCredentials', version=5, params=_params)
++        _params['creds'] = creds
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unexpose(self, application):
++        '''
++        application : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unexpose', version=5, params=_params)
++        _params['application'] = application
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Unset(self, application, options):
++        '''
++        application : str
++        options : typing.Sequence<+T_co>[str]
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Unset', version=5, params=_params)
++        _params['application'] = application
++        _params['options'] = options
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(None)
++    async def Update(self, application, charm_url, constraints, force_charm_url, force_series, min_units, settings, settings_yaml):
++        '''
++        application : str
++        charm_url : str
++        constraints : Value
++        force_charm_url : bool
++        force_series : bool
++        min_units : int
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        settings_yaml : str
++        Returns -> None
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Application', request='Update', version=5, params=_params)
++        _params['application'] = application
++        _params['charm-url'] = charm_url
++        _params['constraints'] = constraints
++        _params['force-charm-url'] = force_charm_url
++        _params['force-series'] = force_series
++        _params['min-units'] = min_units
++        _params['settings'] = settings
++        _params['settings-yaml'] = settings_yaml
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++class UniterFacade(Type):
++    name = 'Uniter'
++    version = 5
++    schema =     {'definitions': {'APIHostPortsResult': {'additionalProperties': False,
++                                            'properties': {'servers': {'items': {'items': {'$ref': '#/definitions/HostPort'},
++                                                                                 'type': 'array'},
++                                                                       'type': 'array'}},
++                                            'required': ['servers'],
++                                            'type': 'object'},
++                     'Action': {'additionalProperties': False,
++                                'properties': {'name': {'type': 'string'},
++                                               'parameters': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                               'receiver': {'type': 'string'},
++                                               'tag': {'type': 'string'}},
++                                'required': ['tag', 'receiver', 'name'],
++                                'type': 'object'},
++                     'ActionExecutionResult': {'additionalProperties': False,
++                                               'properties': {'action-tag': {'type': 'string'},
++                                                              'message': {'type': 'string'},
++                                                              'results': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'},
++                                                              'status': {'type': 'string'}},
++                                               'required': ['action-tag', 'status'],
++                                               'type': 'object'},
++                     'ActionExecutionResults': {'additionalProperties': False,
++                                                'properties': {'results': {'items': {'$ref': '#/definitions/ActionExecutionResult'},
++                                                                           'type': 'array'}},
++                                                'type': 'object'},
++                     'ActionResult': {'additionalProperties': False,
++                                      'properties': {'action': {'$ref': '#/definitions/Action'},
++                                                     'completed': {'format': 'date-time',
++                                                                   'type': 'string'},
++                                                     'enqueued': {'format': 'date-time',
++                                                                  'type': 'string'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'message': {'type': 'string'},
++                                                     'output': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                             'type': 'object'}},
++                                                                'type': 'object'},
++                                                     'started': {'format': 'date-time',
++                                                                 'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'type': 'object'},
++                     'ActionResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/ActionResult'},
++                                                                  'type': 'array'}},
++                                       'type': 'object'},
++                     'Address': {'additionalProperties': False,
++                                 'properties': {'scope': {'type': 'string'},
++                                                'space-name': {'type': 'string'},
++                                                'type': {'type': 'string'},
++                                                'value': {'type': 'string'}},
++                                 'required': ['value', 'type', 'scope'],
++                                 'type': 'object'},
++                     'ApplicationStatusResult': {'additionalProperties': False,
++                                                 'properties': {'application': {'$ref': '#/definitions/StatusResult'},
++                                                                'error': {'$ref': '#/definitions/Error'},
++                                                                'units': {'patternProperties': {'.*': {'$ref': '#/definitions/StatusResult'}},
++                                                                          'type': 'object'}},
++                                                 'required': ['application',
++                                                              'units'],
++                                                 'type': 'object'},
++                     'ApplicationStatusResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationStatusResult'},
++                                                                             'type': 'array'}},
++                                                  'required': ['results'],
++                                                  'type': 'object'},
++                     'BoolResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'result': {'type': 'boolean'}},
++                                    'required': ['result'],
++                                    'type': 'object'},
++                     'BoolResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/BoolResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'BytesResult': {'additionalProperties': False,
++                                     'properties': {'result': {'items': {'type': 'integer'},
++                                                               'type': 'array'}},
++                                     'required': ['result'],
++                                     'type': 'object'},
++                     'CharmRelation': {'additionalProperties': False,
++                                       'properties': {'interface': {'type': 'string'},
++                                                      'limit': {'type': 'integer'},
++                                                      'name': {'type': 'string'},
++                                                      'optional': {'type': 'boolean'},
++                                                      'role': {'type': 'string'},
++                                                      'scope': {'type': 'string'}},
++                                       'required': ['name',
++                                                    'role',
++                                                    'interface',
++                                                    'optional',
++                                                    'limit',
++                                                    'scope'],
++                                       'type': 'object'},
++                     'CharmURL': {'additionalProperties': False,
++                                  'properties': {'url': {'type': 'string'}},
++                                  'required': ['url'],
++                                  'type': 'object'},
++                     'CharmURLs': {'additionalProperties': False,
++                                   'properties': {'urls': {'items': {'$ref': '#/definitions/CharmURL'},
++                                                           'type': 'array'}},
++                                   'required': ['urls'],
++                                   'type': 'object'},
++                     'ConfigSettingsResult': {'additionalProperties': False,
++                                              'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                             'settings': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                       'type': 'object'}},
++                                                                          'type': 'object'}},
++                                              'required': ['settings'],
++                                              'type': 'object'},
++                     'ConfigSettingsResults': {'additionalProperties': False,
++                                               'properties': {'results': {'items': {'$ref': '#/definitions/ConfigSettingsResult'},
++                                                                          'type': 'array'}},
++                                               'required': ['results'],
++                                               'type': 'object'},
++                     'Endpoint': {'additionalProperties': False,
++                                  'properties': {'application-name': {'type': 'string'},
++                                                 'relation': {'$ref': '#/definitions/CharmRelation'}},
++                                  'required': ['application-name', 'relation'],
++                                  'type': 'object'},
++                     'Entities': {'additionalProperties': False,
++                                  'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
++                                                              'type': 'array'}},
++                                  'required': ['entities'],
++                                  'type': 'object'},
++                     'EntitiesCharmURL': {'additionalProperties': False,
++                                          'properties': {'entities': {'items': {'$ref': '#/definitions/EntityCharmURL'},
++                                                                      'type': 'array'}},
++                                          'required': ['entities'],
++                                          'type': 'object'},
++                     'EntitiesPortRanges': {'additionalProperties': False,
++                                            'properties': {'entities': {'items': {'$ref': '#/definitions/EntityPortRange'},
++                                                                        'type': 'array'}},
++                                            'required': ['entities'],
++                                            'type': 'object'},
++                     'Entity': {'additionalProperties': False,
++                                'properties': {'tag': {'type': 'string'}},
++                                'required': ['tag'],
++                                'type': 'object'},
++                     'EntityCharmURL': {'additionalProperties': False,
++                                        'properties': {'charm-url': {'type': 'string'},
++                                                       'tag': {'type': 'string'}},
++                                        'required': ['tag', 'charm-url'],
++                                        'type': 'object'},
++                     'EntityPortRange': {'additionalProperties': False,
++                                         'properties': {'from-port': {'type': 'integer'},
++                                                        'protocol': {'type': 'string'},
++                                                        'tag': {'type': 'string'},
++                                                        'to-port': {'type': 'integer'}},
++                                         'required': ['tag',
++                                                      'protocol',
++                                                      'from-port',
++                                                      'to-port'],
++                                         'type': 'object'},
++                     'EntityStatusArgs': {'additionalProperties': False,
++                                          'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                               'type': 'object'}},
++                                                                  'type': 'object'},
++                                                         'info': {'type': 'string'},
++                                                         'status': {'type': 'string'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag',
++                                                       'status',
++                                                       'info',
++                                                       'data'],
++                                          'type': 'object'},
++                     'EntityWorkloadVersion': {'additionalProperties': False,
++                                               'properties': {'tag': {'type': 'string'},
++                                                              'workload-version': {'type': 'string'}},
++                                               'required': ['tag',
++                                                            'workload-version'],
++                                               'type': 'object'},
++                     'EntityWorkloadVersions': {'additionalProperties': False,
++                                                'properties': {'entities': {'items': {'$ref': '#/definitions/EntityWorkloadVersion'},
++                                                                            'type': 'array'}},
++                                                'required': ['entities'],
++                                                'type': 'object'},
++                     'Error': {'additionalProperties': False,
++                               'properties': {'code': {'type': 'string'},
++                                              'info': {'$ref': '#/definitions/ErrorInfo'},
++                                              'message': {'type': 'string'}},
++                               'required': ['message', 'code'],
++                               'type': 'object'},
++                     'ErrorInfo': {'additionalProperties': False,
++                                   'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
++                                                  'macaroon-path': {'type': 'string'}},
++                                   'type': 'object'},
++                     'ErrorResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'}},
++                                     'type': 'object'},
++                     'ErrorResults': {'additionalProperties': False,
++                                      'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
++                                                                 'type': 'array'}},
++                                      'required': ['results'],
++                                      'type': 'object'},
++                     'GetLeadershipSettingsBulkResults': {'additionalProperties': False,
++                                                          'properties': {'results': {'items': {'$ref': '#/definitions/GetLeadershipSettingsResult'},
++                                                                                     'type': 'array'}},
++                                                          'required': ['results'],
++                                                          'type': 'object'},
++                     'GetLeadershipSettingsResult': {'additionalProperties': False,
++                                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                    'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                 'type': 'object'}},
++                                                     'required': ['settings'],
++                                                     'type': 'object'},
++                     'HostPort': {'additionalProperties': False,
++                                  'properties': {'Address': {'$ref': '#/definitions/Address'},
++                                                 'port': {'type': 'integer'}},
++                                  'required': ['Address', 'port'],
++                                  'type': 'object'},
++                     'IntResult': {'additionalProperties': False,
++                                   'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                  'result': {'type': 'integer'}},
++                                   'required': ['result'],
++                                   'type': 'object'},
++                     'IntResults': {'additionalProperties': False,
++                                    'properties': {'results': {'items': {'$ref': '#/definitions/IntResult'},
++                                                               'type': 'array'}},
++                                    'required': ['results'],
++                                    'type': 'object'},
++                     'InterfaceAddress': {'additionalProperties': False,
++                                          'properties': {'cidr': {'type': 'string'},
++                                                         'value': {'type': 'string'}},
++                                          'required': ['value', 'cidr'],
++                                          'type': 'object'},
++                     'LifeResult': {'additionalProperties': False,
++                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                   'life': {'type': 'string'}},
++                                    'required': ['life'],
++                                    'type': 'object'},
++                     'LifeResults': {'additionalProperties': False,
++                                     'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'},
++                                                                'type': 'array'}},
++                                     'required': ['results'],
++                                     'type': 'object'},
++                     'Macaroon': {'additionalProperties': False, 'type': 'object'},
++                     'MachinePortRange': {'additionalProperties': False,
++                                          'properties': {'port-range': {'$ref': '#/definitions/PortRange'},
++                                                         'relation-tag': {'type': 'string'},
++                                                         'unit-tag': {'type': 'string'}},
++                                          'required': ['unit-tag',
++                                                       'relation-tag',
++                                                       'port-range'],
++                                          'type': 'object'},
++                     'MachinePortsResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'ports': {'items': {'$ref': '#/definitions/MachinePortRange'},
++                                                                     'type': 'array'}},
++                                            'required': ['ports'],
++                                            'type': 'object'},
++                     'MachinePortsResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/MachinePortsResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'MergeLeadershipSettingsBulkParams': {'additionalProperties': False,
++                                                           'properties': {'params': {'items': {'$ref': '#/definitions/MergeLeadershipSettingsParam'},
++                                                                                     'type': 'array'}},
++                                                           'required': ['params'],
++                                                           'type': 'object'},
++                     'MergeLeadershipSettingsParam': {'additionalProperties': False,
++                                                      'properties': {'application-tag': {'type': 'string'},
++                                                                     'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                                  'type': 'object'}},
++                                                      'required': ['application-tag',
++                                                                   'settings'],
++                                                      'type': 'object'},
++                     'MeterStatusResult': {'additionalProperties': False,
++                                           'properties': {'code': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'},
++                                                          'info': {'type': 'string'}},
++                                           'required': ['code', 'info'],
++                                           'type': 'object'},
++                     'MeterStatusResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/MeterStatusResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'Metric': {'additionalProperties': False,
++                                'properties': {'key': {'type': 'string'},
++                                               'time': {'format': 'date-time',
++                                                        'type': 'string'},
++                                               'value': {'type': 'string'}},
++                                'required': ['key', 'value', 'time'],
++                                'type': 'object'},
++                     'MetricBatch': {'additionalProperties': False,
++                                     'properties': {'charm-url': {'type': 'string'},
++                                                    'created': {'format': 'date-time',
++                                                                'type': 'string'},
++                                                    'metrics': {'items': {'$ref': '#/definitions/Metric'},
++                                                                'type': 'array'},
++                                                    'uuid': {'type': 'string'}},
++                                     'required': ['uuid',
++                                                  'charm-url',
++                                                  'created',
++                                                  'metrics'],
++                                     'type': 'object'},
++                     'MetricBatchParam': {'additionalProperties': False,
++                                          'properties': {'batch': {'$ref': '#/definitions/MetricBatch'},
++                                                         'tag': {'type': 'string'}},
++                                          'required': ['tag', 'batch'],
++                                          'type': 'object'},
++                     'MetricBatchParams': {'additionalProperties': False,
++                                           'properties': {'batches': {'items': {'$ref': '#/definitions/MetricBatchParam'},
++                                                                      'type': 'array'}},
++                                           'required': ['batches'],
++                                           'type': 'object'},
++                     'ModelConfigResult': {'additionalProperties': False,
++                                           'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                                  'type': 'object'}},
++                                                                     'type': 'object'}},
++                                           'required': ['config'],
++                                           'type': 'object'},
++                     'ModelResult': {'additionalProperties': False,
++                                     'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                    'name': {'type': 'string'},
++                                                    'uuid': {'type': 'string'}},
++                                     'required': ['name', 'uuid'],
++                                     'type': 'object'},
++                     'NetworkInfo': {'additionalProperties': False,
++                                     'properties': {'addresses': {'items': {'$ref': '#/definitions/InterfaceAddress'},
++                                                                  'type': 'array'},
++                                                    'interface-name': {'type': 'string'},
++                                                    'mac-address': {'type': 'string'}},
++                                     'required': ['mac-address',
++                                                  'interface-name',
++                                                  'addresses'],
++                                     'type': 'object'},
++                     'NetworkInfoParams': {'additionalProperties': False,
++                                           'properties': {'bindings': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                          'unit': {'type': 'string'}},
++                                           'required': ['unit', 'bindings'],
++                                           'type': 'object'},
++                     'NetworkInfoResult': {'additionalProperties': False,
++                                           'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                          'network-info': {'items': {'$ref': '#/definitions/NetworkInfo'},
++                                                                           'type': 'array'}},
++                                           'required': ['network-info'],
++                                           'type': 'object'},
++                     'NetworkInfoResults': {'additionalProperties': False,
++                                            'properties': {'results': {'patternProperties': {'.*': {'$ref': '#/definitions/NetworkInfoResult'}},
++                                                                       'type': 'object'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'NotifyWatchResult': {'additionalProperties': False,
++                                           'properties': {'NotifyWatcherId': {'type': 'string'},
++                                                          'error': {'$ref': '#/definitions/Error'}},
++                                           'required': ['NotifyWatcherId'],
++                                           'type': 'object'},
++                     'NotifyWatchResults': {'additionalProperties': False,
++                                            'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
++                                                                       'type': 'array'}},
++                                            'required': ['results'],
++                                            'type': 'object'},
++                     'PortRange': {'additionalProperties': False,
++                                   'properties': {'from-port': {'type': 'integer'},
++                                                  'protocol': {'type': 'string'},
++                                                  'to-port': {'type': 'integer'}},
++                                   'required': ['from-port', 'to-port', 'protocol'],
++                                   'type': 'object'},
++                     'RelationIds': {'additionalProperties': False,
++                                     'properties': {'relation-ids': {'items': {'type': 'integer'},
++                                                                     'type': 'array'}},
++                                     'required': ['relation-ids'],
++                                     'type': 'object'},
++                     'RelationResult': {'additionalProperties': False,
++                                        'properties': {'endpoint': {'$ref': '#/definitions/Endpoint'},
++                                                       'error': {'$ref': '#/definitions/Error'},
++                                                       'id': {'type': 'integer'},
++                                                       'key': {'type': 'string'},
++                                                       'life': {'type': 'string'}},
++                                        'required': ['life',
++                                                     'id',
++                                                     'key',
++                                                     'endpoint'],
++                                        'type': 'object'},
++                     'RelationResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/RelationResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'},
++                     'RelationUnit': {'additionalProperties': False,
++                                      'properties': {'relation': {'type': 'string'},
++                                                     'unit': {'type': 'string'}},
++                                      'required': ['relation', 'unit'],
++                                      'type': 'object'},
++                     'RelationUnitPair': {'additionalProperties': False,
++                                          'properties': {'local-unit': {'type': 'string'},
++                                                         'relation': {'type': 'string'},
++                                                         'remote-unit': {'type': 'string'}},
++                                          'required': ['relation',
++                                                       'local-unit',
++                                                       'remote-unit'],
++                                          'type': 'object'},
++                     'RelationUnitPairs': {'additionalProperties': False,
++                                           'properties': {'relation-unit-pairs': {'items': {'$ref': '#/definitions/RelationUnitPair'},
++                                                                                  'type': 'array'}},
++                                           'required': ['relation-unit-pairs'],
++                                           'type': 'object'},
++                     'RelationUnitSettings': {'additionalProperties': False,
++                                              'properties': {'relation': {'type': 'string'},
++                                                             'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                          'type': 'object'},
++                                                             'unit': {'type': 'string'}},
++                                              'required': ['relation',
++                                                           'unit',
++                                                           'settings'],
++                                              'type': 'object'},
++                     'RelationUnits': {'additionalProperties': False,
++                                       'properties': {'relation-units': {'items': {'$ref': '#/definitions/RelationUnit'},
++                                                                         'type': 'array'}},
++                                       'required': ['relation-units'],
++                                       'type': 'object'},
++                     'RelationUnitsChange': {'additionalProperties': False,
++                                             'properties': {'changed': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitSettings'}},
++                                                                        'type': 'object'},
++                                                            'departed': {'items': {'type': 'string'},
++                                                                         'type': 'array'}},
++                                             'required': ['changed'],
++                                             'type': 'object'},
++                     'RelationUnitsSettings': {'additionalProperties': False,
++                                               'properties': {'relation-units': {'items': {'$ref': '#/definitions/RelationUnitSettings'},
++                                                                                 'type': 'array'}},
++                                               'required': ['relation-units'],
++                                               'type': 'object'},
++                     'RelationUnitsWatchResult': {'additionalProperties': False,
++                                                  'properties': {'changes': {'$ref': '#/definitions/RelationUnitsChange'},
++                                                                 'error': {'$ref': '#/definitions/Error'},
++                                                                 'watcher-id': {'type': 'string'}},
++                                                  'required': ['watcher-id',
++                                                               'changes'],
++                                                  'type': 'object'},
++                     'RelationUnitsWatchResults': {'additionalProperties': False,
++                                                   'properties': {'results': {'items': {'$ref': '#/definitions/RelationUnitsWatchResult'},
++                                                                              'type': 'array'}},
++                                                   'required': ['results'],
++                                                   'type': 'object'},
++                     'ResolvedModeResult': {'additionalProperties': False,
++                                            'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                           'mode': {'type': 'string'}},
++                                            'required': ['mode'],
++                                            'type': 'object'},
++                     'ResolvedModeResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/ResolvedModeResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'SetStatus': {'additionalProperties': False,
++                                   'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'},
++                                                               'type': 'array'}},
++                                   'required': ['entities'],
++                                   'type': 'object'},
++                     'SettingsResult': {'additionalProperties': False,
++                                        'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                       'settings': {'patternProperties': {'.*': {'type': 'string'}},
++                                                                    'type': 'object'}},
++                                        'required': ['settings'],
++                                        'type': 'object'},
++                     'SettingsResults': {'additionalProperties': False,
++                                         'properties': {'results': {'items': {'$ref': '#/definitions/SettingsResult'},
++                                                                    'type': 'array'}},
++                                         'required': ['results'],
++                                         'type': 'object'},
++                     'StatusResult': {'additionalProperties': False,
++                                      'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True,
++                                                                                           'type': 'object'}},
++                                                              'type': 'object'},
++                                                     'error': {'$ref': '#/definitions/Error'},
++                                                     'id': {'type': 'string'},
++                                                     'info': {'type': 'string'},
++                                                     'life': {'type': 'string'},
++                                                     'since': {'format': 'date-time',
++                                                               'type': 'string'},
++                                                     'status': {'type': 'string'}},
++                                      'required': ['id',
++                                                   'life',
++                                                   'status',
++                                                   'info',
++                                                   'data',
++                                                   'since'],
++                                      'type': 'object'},
++                     'StatusResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StatusResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StorageAddParams': {'additionalProperties': False,
++                                          'properties': {'name': {'type': 'string'},
++                                                         'storage': {'$ref': '#/definitions/StorageConstraints'},
++                                                         'unit': {'type': 'string'}},
++                                          'required': ['unit', 'name', 'storage'],
++                                          'type': 'object'},
++                     'StorageAttachment': {'additionalProperties': False,
++                                           'properties': {'kind': {'type': 'integer'},
++                                                          'life': {'type': 'string'},
++                                                          'location': {'type': 'string'},
++                                                          'owner-tag': {'type': 'string'},
++                                                          'storage-tag': {'type': 'string'},
++                                                          'unit-tag': {'type': 'string'}},
++                                           'required': ['storage-tag',
++                                                        'owner-tag',
++                                                        'unit-tag',
++                                                        'kind',
++                                                        'location',
++                                                        'life'],
++                                           'type': 'object'},
++                     'StorageAttachmentId': {'additionalProperties': False,
++                                             'properties': {'storage-tag': {'type': 'string'},
++                                                            'unit-tag': {'type': 'string'}},
++                                             'required': ['storage-tag',
++                                                          'unit-tag'],
++                                             'type': 'object'},
++                     'StorageAttachmentIds': {'additionalProperties': False,
++                                              'properties': {'ids': {'items': {'$ref': '#/definitions/StorageAttachmentId'},
++                                                                     'type': 'array'}},
++                                              'required': ['ids'],
++                                              'type': 'object'},
++                     'StorageAttachmentIdsResult': {'additionalProperties': False,
++                                                    'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                   'result': {'$ref': '#/definitions/StorageAttachmentIds'}},
++                                                    'required': ['result'],
++                                                    'type': 'object'},
++                     'StorageAttachmentIdsResults': {'additionalProperties': False,
++                                                     'properties': {'results': {'items': {'$ref': '#/definitions/StorageAttachmentIdsResult'},
++                                                                                'type': 'array'}},
++                                                     'type': 'object'},
++                     'StorageAttachmentResult': {'additionalProperties': False,
++                                                 'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                                'result': {'$ref': '#/definitions/StorageAttachment'}},
++                                                 'required': ['result'],
++                                                 'type': 'object'},
++                     'StorageAttachmentResults': {'additionalProperties': False,
++                                                  'properties': {'results': {'items': {'$ref': '#/definitions/StorageAttachmentResult'},
++                                                                             'type': 'array'}},
++                                                  'type': 'object'},
++                     'StorageConstraints': {'additionalProperties': False,
++                                            'properties': {'count': {'type': 'integer'},
++                                                           'pool': {'type': 'string'},
++                                                           'size': {'type': 'integer'}},
++                                            'type': 'object'},
++                     'StoragesAddParams': {'additionalProperties': False,
++                                           'properties': {'storages': {'items': {'$ref': '#/definitions/StorageAddParams'},
++                                                                       'type': 'array'}},
++                                           'required': ['storages'],
++                                           'type': 'object'},
++                     'StringBoolResult': {'additionalProperties': False,
++                                          'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                         'ok': {'type': 'boolean'},
++                                                         'result': {'type': 'string'}},
++                                          'required': ['result', 'ok'],
++                                          'type': 'object'},
++                     'StringBoolResults': {'additionalProperties': False,
++                                           'properties': {'results': {'items': {'$ref': '#/definitions/StringBoolResult'},
++                                                                      'type': 'array'}},
++                                           'required': ['results'],
++                                           'type': 'object'},
++                     'StringResult': {'additionalProperties': False,
++                                      'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                     'result': {'type': 'string'}},
++                                      'required': ['result'],
++                                      'type': 'object'},
++                     'StringResults': {'additionalProperties': False,
++                                       'properties': {'results': {'items': {'$ref': '#/definitions/StringResult'},
++                                                                  'type': 'array'}},
++                                       'required': ['results'],
++                                       'type': 'object'},
++                     'StringsResult': {'additionalProperties': False,
++                                       'properties': {'error': {'$ref': '#/definitions/Error'},
++                                                      'result': {'items': {'type': 'string'},
++                                                                 'type': 'array'}},
++                                       'type': 'object'},
++                     'StringsResults': {'additionalProperties': False,
++                                        'properties': {'results': {'items': {'$ref': '#/definitions/StringsResult'},
++                                                                   'type': 'array'}},
++                                        'required': ['results'],
++                                        'type': 'object'},
++                     'StringsWatchResult': {'additionalProperties': False,
++                                            'properties': {'changes': {'items': {'type': 'string'},
++                                                                       'type': 'array'},
++                                                           'error': {'$ref': '#/definitions/Error'},
++                                                           'watcher-id': {'type': 'string'}},
++                                            'required': ['watcher-id'],
++                                            'type': 'object'},
++                     'StringsWatchResults': {'additionalProperties': False,
++                                             'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'},
++                                                                        'type': 'array'}},
++                                             'required': ['results'],
++                                             'type': 'object'},
++                     'UnitSettings': {'additionalProperties': False,
++                                      'properties': {'version': {'type': 'integer'}},
++                                      'required': ['version'],
++                                      'type': 'object'}},
++     'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}},
++                                     'type': 'object'},
++                    'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
++                                     'type': 'object'},
++                    'Actions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ActionResults'}},
++                                'type': 'object'},
++                    'AddMetricBatches': {'properties': {'Params': {'$ref': '#/definitions/MetricBatchParams'},
++                                                        'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                         'type': 'object'},
++                    'AddUnitStorage': {'properties': {'Params': {'$ref': '#/definitions/StoragesAddParams'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'AllMachinePorts': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/MachinePortsResults'}},
++                                        'type': 'object'},
++                    'ApplicationStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                         'Result': {'$ref': '#/definitions/ApplicationStatusResults'}},
++                                          'type': 'object'},
++                    'AssignedMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringResults'}},
++                                        'type': 'object'},
++                    'AvailabilityZone': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/StringResults'}},
++                                         'type': 'object'},
++                    'BeginActions': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                     'type': 'object'},
++                    'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
++                               'type': 'object'},
++                    'CharmArchiveSha256': {'properties': {'Params': {'$ref': '#/definitions/CharmURLs'},
++                                                          'Result': {'$ref': '#/definitions/StringResults'}},
++                                           'type': 'object'},
++                    'CharmModifiedVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                            'Result': {'$ref': '#/definitions/IntResults'}},
++                                             'type': 'object'},
++                    'CharmURL': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                'Result': {'$ref': '#/definitions/StringBoolResults'}},
++                                 'type': 'object'},
++                    'ClearResolved': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'ClosePorts': {'properties': {'Params': {'$ref': '#/definitions/EntitiesPortRanges'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'ConfigSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/ConfigSettingsResults'}},
++                                       'type': 'object'},
++                    'CurrentModel': {'properties': {'Result': {'$ref': '#/definitions/ModelResult'}},
++                                     'type': 'object'},
++                    'Destroy': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                               'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                'type': 'object'},
++                    'DestroyAllSubordinates': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                               'type': 'object'},
++                    'DestroyUnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                      'type': 'object'},
++                    'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'EnterScope': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'FinishActions': {'properties': {'Params': {'$ref': '#/definitions/ActionExecutionResults'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'GetMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/MeterStatusResults'}},
++                                       'type': 'object'},
++                    'GetPrincipal': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                    'Result': {'$ref': '#/definitions/StringBoolResults'}},
++                                     'type': 'object'},
++                    'HasSubordinates': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/BoolResults'}},
++                                        'type': 'object'},
++                    'JoinedRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringsResults'}},
++                                        'type': 'object'},
++                    'LeaveScope': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                  'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                   'type': 'object'},
++                    'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/LifeResults'}},
++                             'type': 'object'},
++                    'Merge': {'properties': {'Params': {'$ref': '#/definitions/MergeLeadershipSettingsBulkParams'},
++                                             'Result': {'$ref': '#/definitions/ErrorResults'}},
++                              'type': 'object'},
++                    'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}},
++                                    'type': 'object'},
++                    'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                  'type': 'object'},
++                    'NetworkInfo': {'properties': {'Params': {'$ref': '#/definitions/NetworkInfoParams'},
++                                                   'Result': {'$ref': '#/definitions/NetworkInfoResults'}},
++                                    'type': 'object'},
++                    'OpenPorts': {'properties': {'Params': {'$ref': '#/definitions/EntitiesPortRanges'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'PrivateAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                      'Result': {'$ref': '#/definitions/StringResults'}},
++                                       'type': 'object'},
++                    'ProviderType': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                     'type': 'object'},
++                    'PublicAddress': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/StringResults'}},
++                                      'type': 'object'},
++                    'Read': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                            'Result': {'$ref': '#/definitions/GetLeadershipSettingsBulkResults'}},
++                             'type': 'object'},
++                    'ReadRemoteSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnitPairs'},
++                                                          'Result': {'$ref': '#/definitions/SettingsResults'}},
++                                           'type': 'object'},
++                    'ReadSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                    'Result': {'$ref': '#/definitions/SettingsResults'}},
++                                     'type': 'object'},
++                    'Relation': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                'Result': {'$ref': '#/definitions/RelationResults'}},
++                                 'type': 'object'},
++                    'RelationById': {'properties': {'Params': {'$ref': '#/definitions/RelationIds'},
++                                                    'Result': {'$ref': '#/definitions/RelationResults'}},
++                                     'type': 'object'},
++                    'RemoveStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                                'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                                 'type': 'object'},
++                    'RequestReboot': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'Resolved': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                'Result': {'$ref': '#/definitions/ResolvedModeResults'}},
++                                 'type': 'object'},
++                    'SLALevel': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}},
++                                 'type': 'object'},
++                    'SetAgentStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'SetApplicationStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                            'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                             'type': 'object'},
++                    'SetCharmURL': {'properties': {'Params': {'$ref': '#/definitions/EntitiesCharmURL'},
++                                                   'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                    'type': 'object'},
++                    'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                 'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                  'type': 'object'},
++                    'SetUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'},
++                                                     'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                      'type': 'object'},
++                    'SetWorkloadVersion': {'properties': {'Params': {'$ref': '#/definitions/EntityWorkloadVersions'},
++                                                          'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                           'type': 'object'},
++                    'StorageAttachmentLife': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                             'Result': {'$ref': '#/definitions/LifeResults'}},
++                                              'type': 'object'},
++                    'StorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                          'Result': {'$ref': '#/definitions/StorageAttachmentResults'}},
++                                           'type': 'object'},
++                    'UnitStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                  'Result': {'$ref': '#/definitions/StatusResults'}},
++                                   'type': 'object'},
++                    'UnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                              'Result': {'$ref': '#/definitions/StorageAttachmentIdsResults'}},
++                                               'type': 'object'},
++                    'UpdateSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnitsSettings'},
++                                                      'Result': {'$ref': '#/definitions/ErrorResults'}},
++                                       'type': 'object'},
++                    'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                             'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                              'type': 'object'},
++                    'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                          'type': 'object'},
++                    'WatchActionNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                 'type': 'object'},
++                    'WatchConfigSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                           'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                            'type': 'object'},
++                    'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}},
++                                                   'type': 'object'},
++                    'WatchLeadershipSettings': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                               'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                                'type': 'object'},
++                    'WatchMeterStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                        'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                         'type': 'object'},
++                    'WatchRelationUnits': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'},
++                                                          'Result': {'$ref': '#/definitions/RelationUnitsWatchResults'}},
++                                           'type': 'object'},
++                    'WatchStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'},
++                                                               'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                                'type': 'object'},
++                    'WatchUnitAddresses': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/NotifyWatchResults'}},
++                                           'type': 'object'},
++                    'WatchUnitRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                          'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                           'type': 'object'},
++                    'WatchUnitStorageAttachments': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                                   'Result': {'$ref': '#/definitions/StringsWatchResults'}},
++                                                    'type': 'object'},
++                    'WorkloadVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
++                                                       'Result': {'$ref': '#/definitions/StringResults'}},
++                                        'type': 'object'}},
++     'type': 'object'}
++    
++
++    @ReturnMapping(StringsResult)
++    async def APIAddresses(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='APIAddresses', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(APIHostPortsResult)
++    async def APIHostPorts(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='APIHostPorts', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ActionResults)
++    async def Actions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Actions', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def AddMetricBatches(self, batches):
++        '''
++        batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AddMetricBatches', version=5, params=_params)
++        _params['batches'] = batches
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def AddUnitStorage(self, storages):
++        '''
++        storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AddUnitStorage', version=5, params=_params)
++        _params['storages'] = storages
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MachinePortsResults)
++    async def AllMachinePorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AllMachinePorts', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ApplicationStatusResults)
++    async def ApplicationStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ApplicationStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def AssignedMachine(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AssignedMachine', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def AvailabilityZone(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='AvailabilityZone', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def BeginActions(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='BeginActions', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BytesResult)
++    async def CACert(self):
++        '''
++
++        Returns -> typing.Sequence<+T_co>[int]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CACert', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def CharmArchiveSha256(self, urls):
++        '''
++        urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmArchiveSha256', version=5, params=_params)
++        _params['urls'] = urls
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(IntResults)
++    async def CharmModifiedVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~IntResult]<~IntResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmModifiedVersion', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringBoolResults)
++    async def CharmURL(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CharmURL', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ClearResolved(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ClearResolved', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def ClosePorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ClosePorts', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ConfigSettingsResults)
++    async def ConfigSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ConfigSettings', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelResult)
++    async def CurrentModel(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='CurrentModel', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Destroy(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Destroy', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyAllSubordinates(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='DestroyAllSubordinates', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def DestroyUnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='DestroyUnitStorageAttachments', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnsureDead(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='EnsureDead', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def EnterScope(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='EnterScope', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def FinishActions(self, results):
++        '''
++        results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='FinishActions', version=5, params=_params)
++        _params['results'] = results
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(MeterStatusResults)
++    async def GetMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='GetMeterStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringBoolResults)
++    async def GetPrincipal(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='GetPrincipal', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(BoolResults)
++    async def HasSubordinates(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='HasSubordinates', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsResults)
++    async def JoinedRelations(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='JoinedRelations', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def LeaveScope(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='LeaveScope', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def Life(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Life', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def Merge(self, params):
++        '''
++        params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Merge', version=5, params=_params)
++        _params['params'] = params
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ModelConfigResult)
++    async def ModelConfig(self):
++        '''
++
++        Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ModelConfig', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ModelUUID(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ModelUUID', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NetworkInfoResults)
++    async def NetworkInfo(self, bindings, unit):
++        '''
++        bindings : typing.Sequence<+T_co>[str]
++        unit : str
++        Returns -> typing.Mapping<~KT, +VT_co>[str, ~NetworkInfoResult]<~NetworkInfoResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='NetworkInfo', version=5, params=_params)
++        _params['bindings'] = bindings
++        _params['unit'] = unit
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def OpenPorts(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='OpenPorts', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def PrivateAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='PrivateAddress', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def ProviderType(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ProviderType', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def PublicAddress(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='PublicAddress', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(GetLeadershipSettingsBulkResults)
++    async def Read(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Read', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SettingsResults)
++    async def ReadRemoteSettings(self, relation_unit_pairs):
++        '''
++        relation_unit_pairs : typing.Sequence<+T_co>[~RelationUnitPair]<~RelationUnitPair>
++        Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ReadRemoteSettings', version=5, params=_params)
++        _params['relation-unit-pairs'] = relation_unit_pairs
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(SettingsResults)
++    async def ReadSettings(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='ReadSettings', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationResults)
++    async def Relation(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Relation', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationResults)
++    async def RelationById(self, relation_ids):
++        '''
++        relation_ids : typing.Sequence<+T_co>[int]
++        Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RelationById', version=5, params=_params)
++        _params['relation-ids'] = relation_ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RemoveStorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RemoveStorageAttachments', version=5, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def RequestReboot(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='RequestReboot', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ResolvedModeResults)
++    async def Resolved(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Resolved', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResult)
++    async def SLALevel(self):
++        '''
++
++        Returns -> typing.Union[_ForwardRef('Error'), str]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SLALevel', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetAgentStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetAgentStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetApplicationStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetApplicationStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetCharmURL(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetCharmURL', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetUnitStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetUnitStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def SetWorkloadVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='SetWorkloadVersion', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(LifeResults)
++    async def StorageAttachmentLife(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='StorageAttachmentLife', version=5, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageAttachmentResults)
++    async def StorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='StorageAttachments', version=5, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StatusResults)
++    async def UnitStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UnitStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StorageAttachmentIdsResults)
++    async def UnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UnitStorageAttachments', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(ErrorResults)
++    async def UpdateSettings(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings>
++        Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='UpdateSettings', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def Watch(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='Watch', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchAPIHostPorts(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchAPIHostPorts', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchActionNotifications(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchActionNotifications', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchConfigSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchConfigSettings', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResult)
++    async def WatchForModelConfigChanges(self):
++        '''
++
++        Returns -> typing.Union[str, _ForwardRef('Error')]
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchForModelConfigChanges', version=5, params=_params)
++
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchLeadershipSettings(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchLeadershipSettings', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchMeterStatus(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchMeterStatus', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(RelationUnitsWatchResults)
++    async def WatchRelationUnits(self, relation_units):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        Returns -> typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchRelationUnits', version=5, params=_params)
++        _params['relation-units'] = relation_units
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchStorageAttachments(self, ids):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchStorageAttachments', version=5, params=_params)
++        _params['ids'] = ids
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(NotifyWatchResults)
++    async def WatchUnitAddresses(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchUnitAddresses', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchUnitRelations(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchUnitRelations', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringsWatchResults)
++    async def WatchUnitStorageAttachments(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WatchUnitStorageAttachments', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
++
++    @ReturnMapping(StringResults)
++    async def WorkloadVersion(self, entities):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Uniter', request='WorkloadVersion', version=5, params=_params)
++        _params['entities'] = entities
++        reply = await self.rpc(msg)
++        return reply
++
++
index 0000000,0000000..198784d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,8022 @@@
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++from juju.client.facade import Type, ReturnMapping
++
++
++class APIHostPortsResult(Type):
++    _toSchema = {'servers': 'servers'}
++    _toPy = {'servers': 'servers'}
++    def __init__(self, servers=None, **unknown_fields):
++        '''
++        servers : typing.Sequence<+T_co>[~HostPort]<~HostPort>
++        '''
++        self.servers = [HostPort.from_json(o) for o in servers or []]
++
++
++
++class Action(Type):
++    _toSchema = {'name': 'name', 'parameters': 'parameters', 'receiver': 'receiver', 'tag': 'tag'}
++    _toPy = {'name': 'name', 'parameters': 'parameters', 'receiver': 'receiver', 'tag': 'tag'}
++    def __init__(self, name=None, parameters=None, receiver=None, tag=None, **unknown_fields):
++        '''
++        name : str
++        parameters : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        receiver : str
++        tag : str
++        '''
++        self.name = name
++        self.parameters = parameters
++        self.receiver = receiver
++        self.tag = tag
++
++
++
++class ActionExecutionResult(Type):
++    _toSchema = {'action_tag': 'action-tag', 'message': 'message', 'results': 'results', 'status': 'status'}
++    _toPy = {'action-tag': 'action_tag', 'message': 'message', 'results': 'results', 'status': 'status'}
++    def __init__(self, action_tag=None, message=None, results=None, status=None, **unknown_fields):
++        '''
++        action_tag : str
++        message : str
++        results : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        status : str
++        '''
++        self.action_tag = action_tag
++        self.message = message
++        self.results = results
++        self.status = status
++
++
++
++class ActionExecutionResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult>
++        '''
++        self.results = [ActionExecutionResult.from_json(o) for o in results or []]
++
++
++
++class ActionResult(Type):
++    _toSchema = {'action': 'action', 'completed': 'completed', 'enqueued': 'enqueued', 'error': 'error', 'message': 'message', 'output': 'output', 'started': 'started', 'status': 'status'}
++    _toPy = {'action': 'action', 'completed': 'completed', 'enqueued': 'enqueued', 'error': 'error', 'message': 'message', 'output': 'output', 'started': 'started', 'status': 'status'}
++    def __init__(self, action=None, completed=None, enqueued=None, error=None, message=None, output=None, started=None, status=None, **unknown_fields):
++        '''
++        action : Action
++        completed : str
++        enqueued : str
++        error : Error
++        message : str
++        output : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        started : str
++        status : str
++        '''
++        self.action = Action.from_json(action) if action else None
++        self.completed = completed
++        self.enqueued = enqueued
++        self.error = Error.from_json(error) if error else None
++        self.message = message
++        self.output = output
++        self.started = started
++        self.status = status
++
++
++
++class ActionResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        '''
++        self.results = [ActionResult.from_json(o) for o in results or []]
++
++
++
++class ActionSpec(Type):
++    _toSchema = {'description': 'description', 'params': 'params'}
++    _toPy = {'description': 'description', 'params': 'params'}
++    def __init__(self, description=None, params=None, **unknown_fields):
++        '''
++        description : str
++        params : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.description = description
++        self.params = params
++
++
++
++class Actions(Type):
++    _toSchema = {'actions': 'actions'}
++    _toPy = {'actions': 'actions'}
++    def __init__(self, actions=None, **unknown_fields):
++        '''
++        actions : typing.Sequence<+T_co>[~Action]<~Action>
++        '''
++        self.actions = [Action.from_json(o) for o in actions or []]
++
++
++
++class ActionsByName(Type):
++    _toSchema = {'actions': 'actions', 'error': 'error', 'name': 'name'}
++    _toPy = {'actions': 'actions', 'error': 'error', 'name': 'name'}
++    def __init__(self, actions=None, error=None, name=None, **unknown_fields):
++        '''
++        actions : typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        error : Error
++        name : str
++        '''
++        self.actions = [ActionResult.from_json(o) for o in actions or []]
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++
++
++
++class ActionsByNames(Type):
++    _toSchema = {'actions': 'actions'}
++    _toPy = {'actions': 'actions'}
++    def __init__(self, actions=None, **unknown_fields):
++        '''
++        actions : typing.Sequence<+T_co>[~ActionsByName]<~ActionsByName>
++        '''
++        self.actions = [ActionsByName.from_json(o) for o in actions or []]
++
++
++
++class ActionsByReceiver(Type):
++    _toSchema = {'actions': 'actions', 'error': 'error', 'receiver': 'receiver'}
++    _toPy = {'actions': 'actions', 'error': 'error', 'receiver': 'receiver'}
++    def __init__(self, actions=None, error=None, receiver=None, **unknown_fields):
++        '''
++        actions : typing.Sequence<+T_co>[~ActionResult]<~ActionResult>
++        error : Error
++        receiver : str
++        '''
++        self.actions = [ActionResult.from_json(o) for o in actions or []]
++        self.error = Error.from_json(error) if error else None
++        self.receiver = receiver
++
++
++
++class ActionsByReceivers(Type):
++    _toSchema = {'actions': 'actions'}
++    _toPy = {'actions': 'actions'}
++    def __init__(self, actions=None, **unknown_fields):
++        '''
++        actions : typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver>
++        '''
++        self.actions = [ActionsByReceiver.from_json(o) for o in actions or []]
++
++
++
++class AddApplicationUnits(Type):
++    _toSchema = {'application': 'application', 'num_units': 'num-units', 'placement': 'placement'}
++    _toPy = {'application': 'application', 'num-units': 'num_units', 'placement': 'placement'}
++    def __init__(self, application=None, num_units=None, placement=None, **unknown_fields):
++        '''
++        application : str
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        '''
++        self.application = application
++        self.num_units = num_units
++        self.placement = [Placement.from_json(o) for o in placement or []]
++
++
++
++class AddApplicationUnitsResults(Type):
++    _toSchema = {'units': 'units'}
++    _toPy = {'units': 'units'}
++    def __init__(self, units=None, **unknown_fields):
++        '''
++        units : typing.Sequence<+T_co>[str]
++        '''
++        self.units = units
++
++
++
++class AddCharm(Type):
++    _toSchema = {'channel': 'channel', 'url': 'url'}
++    _toPy = {'channel': 'channel', 'url': 'url'}
++    def __init__(self, channel=None, url=None, **unknown_fields):
++        '''
++        channel : str
++        url : str
++        '''
++        self.channel = channel
++        self.url = url
++
++
++
++class AddCharmWithAuthorization(Type):
++    _toSchema = {'channel': 'channel', 'macaroon': 'macaroon', 'url': 'url'}
++    _toPy = {'channel': 'channel', 'macaroon': 'macaroon', 'url': 'url'}
++    def __init__(self, channel=None, macaroon=None, url=None, **unknown_fields):
++        '''
++        channel : str
++        macaroon : Macaroon
++        url : str
++        '''
++        self.channel = channel
++        self.macaroon = Macaroon.from_json(macaroon) if macaroon else None
++        self.url = url
++
++
++
++class AddMachineParams(Type):
++    _toSchema = {'addresses': 'addresses', 'constraints': 'constraints', 'container_type': 'container-type', 'disks': 'disks', 'hardware_characteristics': 'hardware-characteristics', 'instance_id': 'instance-id', 'jobs': 'jobs', 'nonce': 'nonce', 'parent_id': 'parent-id', 'placement': 'placement', 'series': 'series'}
++    _toPy = {'addresses': 'addresses', 'constraints': 'constraints', 'container-type': 'container_type', 'disks': 'disks', 'hardware-characteristics': 'hardware_characteristics', 'instance-id': 'instance_id', 'jobs': 'jobs', 'nonce': 'nonce', 'parent-id': 'parent_id', 'placement': 'placement', 'series': 'series'}
++    def __init__(self, addresses=None, constraints=None, container_type=None, disks=None, hardware_characteristics=None, instance_id=None, jobs=None, nonce=None, parent_id=None, placement=None, series=None, **unknown_fields):
++        '''
++        addresses : typing.Sequence<+T_co>[~Address]<~Address>
++        constraints : Value
++        container_type : str
++        disks : typing.Sequence<+T_co>[~Constraints]<~Constraints>
++        hardware_characteristics : HardwareCharacteristics
++        instance_id : str
++        jobs : typing.Sequence<+T_co>[str]
++        nonce : str
++        parent_id : str
++        placement : Placement
++        series : str
++        '''
++        self.addresses = [Address.from_json(o) for o in addresses or []]
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.container_type = container_type
++        self.disks = [Constraints.from_json(o) for o in disks or []]
++        self.hardware_characteristics = HardwareCharacteristics.from_json(hardware_characteristics) if hardware_characteristics else None
++        self.instance_id = instance_id
++        self.jobs = jobs
++        self.nonce = nonce
++        self.parent_id = parent_id
++        self.placement = Placement.from_json(placement) if placement else None
++        self.series = series
++
++
++
++class AddMachines(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams>
++        '''
++        self.params = [AddMachineParams.from_json(o) for o in params or []]
++
++
++
++class AddMachinesResult(Type):
++    _toSchema = {'error': 'error', 'machine': 'machine'}
++    _toPy = {'error': 'error', 'machine': 'machine'}
++    def __init__(self, error=None, machine=None, **unknown_fields):
++        '''
++        error : Error
++        machine : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.machine = machine
++
++
++
++class AddMachinesResults(Type):
++    _toSchema = {'machines': 'machines'}
++    _toPy = {'machines': 'machines'}
++    def __init__(self, machines=None, **unknown_fields):
++        '''
++        machines : typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult>
++        '''
++        self.machines = [AddMachinesResult.from_json(o) for o in machines or []]
++
++
++
++class AddPendingResourcesArgs(Type):
++    _toSchema = {'addcharmwithauthorization': 'AddCharmWithAuthorization', 'entity': 'Entity', 'resources': 'Resources'}
++    _toPy = {'AddCharmWithAuthorization': 'addcharmwithauthorization', 'Entity': 'entity', 'Resources': 'resources'}
++    def __init__(self, addcharmwithauthorization=None, entity=None, resources=None, **unknown_fields):
++        '''
++        addcharmwithauthorization : AddCharmWithAuthorization
++        entity : Entity
++        resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource>
++        '''
++        self.addcharmwithauthorization = AddCharmWithAuthorization.from_json(addcharmwithauthorization) if addcharmwithauthorization else None
++        self.entity = Entity.from_json(entity) if entity else None
++        self.resources = [CharmResource.from_json(o) for o in resources or []]
++
++
++
++class AddPendingResourcesResult(Type):
++    _toSchema = {'errorresult': 'ErrorResult', 'pending_ids': 'pending-ids'}
++    _toPy = {'ErrorResult': 'errorresult', 'pending-ids': 'pending_ids'}
++    def __init__(self, errorresult=None, pending_ids=None, **unknown_fields):
++        '''
++        errorresult : ErrorResult
++        pending_ids : typing.Sequence<+T_co>[str]
++        '''
++        self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None
++        self.pending_ids = pending_ids
++
++
++
++class AddRelation(Type):
++    _toSchema = {'endpoints': 'endpoints'}
++    _toPy = {'endpoints': 'endpoints'}
++    def __init__(self, endpoints=None, **unknown_fields):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        '''
++        self.endpoints = endpoints
++
++
++
++class AddRelationResults(Type):
++    _toSchema = {'endpoints': 'endpoints'}
++    _toPy = {'endpoints': 'endpoints'}
++    def __init__(self, endpoints=None, **unknown_fields):
++        '''
++        endpoints : typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        '''
++        self.endpoints = endpoints
++
++
++
++class AddSubnetParams(Type):
++    _toSchema = {'space_tag': 'space-tag', 'subnet_provider_id': 'subnet-provider-id', 'subnet_tag': 'subnet-tag', 'zones': 'zones'}
++    _toPy = {'space-tag': 'space_tag', 'subnet-provider-id': 'subnet_provider_id', 'subnet-tag': 'subnet_tag', 'zones': 'zones'}
++    def __init__(self, space_tag=None, subnet_provider_id=None, subnet_tag=None, zones=None, **unknown_fields):
++        '''
++        space_tag : str
++        subnet_provider_id : str
++        subnet_tag : str
++        zones : typing.Sequence<+T_co>[str]
++        '''
++        self.space_tag = space_tag
++        self.subnet_provider_id = subnet_provider_id
++        self.subnet_tag = subnet_tag
++        self.zones = zones
++
++
++
++class AddSubnetsParams(Type):
++    _toSchema = {'subnets': 'subnets'}
++    _toPy = {'subnets': 'subnets'}
++    def __init__(self, subnets=None, **unknown_fields):
++        '''
++        subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams>
++        '''
++        self.subnets = [AddSubnetParams.from_json(o) for o in subnets or []]
++
++
++
++class AddUser(Type):
++    _toSchema = {'display_name': 'display-name', 'password': 'password', 'username': 'username'}
++    _toPy = {'display-name': 'display_name', 'password': 'password', 'username': 'username'}
++    def __init__(self, display_name=None, password=None, username=None, **unknown_fields):
++        '''
++        display_name : str
++        password : str
++        username : str
++        '''
++        self.display_name = display_name
++        self.password = password
++        self.username = username
++
++
++
++class AddUserResult(Type):
++    _toSchema = {'error': 'error', 'secret_key': 'secret-key', 'tag': 'tag'}
++    _toPy = {'error': 'error', 'secret-key': 'secret_key', 'tag': 'tag'}
++    def __init__(self, error=None, secret_key=None, tag=None, **unknown_fields):
++        '''
++        error : Error
++        secret_key : typing.Sequence<+T_co>[int]
++        tag : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.secret_key = secret_key
++        self.tag = tag
++
++
++
++class AddUserResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~AddUserResult]<~AddUserResult>
++        '''
++        self.results = [AddUserResult.from_json(o) for o in results or []]
++
++
++
++class AddUsers(Type):
++    _toSchema = {'users': 'users'}
++    _toPy = {'users': 'users'}
++    def __init__(self, users=None, **unknown_fields):
++        '''
++        users : typing.Sequence<+T_co>[~AddUser]<~AddUser>
++        '''
++        self.users = [AddUser.from_json(o) for o in users or []]
++
++
++
++class Address(Type):
++    _toSchema = {'scope': 'scope', 'space_name': 'space-name', 'type_': 'type', 'value': 'value'}
++    _toPy = {'scope': 'scope', 'space-name': 'space_name', 'type': 'type_', 'value': 'value'}
++    def __init__(self, scope=None, space_name=None, type_=None, value=None, **unknown_fields):
++        '''
++        scope : str
++        space_name : str
++        type_ : str
++        value : str
++        '''
++        self.scope = scope
++        self.space_name = space_name
++        self.type_ = type_
++        self.value = value
++
++
++
++class AdoptResourcesArgs(Type):
++    _toSchema = {'model_tag': 'model-tag', 'source_controller_version': 'source-controller-version'}
++    _toPy = {'model-tag': 'model_tag', 'source-controller-version': 'source_controller_version'}
++    def __init__(self, model_tag=None, source_controller_version=None, **unknown_fields):
++        '''
++        model_tag : str
++        source_controller_version : Number
++        '''
++        self.model_tag = model_tag
++        self.source_controller_version = Number.from_json(source_controller_version) if source_controller_version else None
++
++
++
++class AgentGetEntitiesResult(Type):
++    _toSchema = {'container_type': 'container-type', 'error': 'error', 'jobs': 'jobs', 'life': 'life'}
++    _toPy = {'container-type': 'container_type', 'error': 'error', 'jobs': 'jobs', 'life': 'life'}
++    def __init__(self, container_type=None, error=None, jobs=None, life=None, **unknown_fields):
++        '''
++        container_type : str
++        error : Error
++        jobs : typing.Sequence<+T_co>[str]
++        life : str
++        '''
++        self.container_type = container_type
++        self.error = Error.from_json(error) if error else None
++        self.jobs = jobs
++        self.life = life
++
++
++
++class AgentGetEntitiesResults(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~AgentGetEntitiesResult]<~AgentGetEntitiesResult>
++        '''
++        self.entities = [AgentGetEntitiesResult.from_json(o) for o in entities or []]
++
++
++
++class AgentVersionResult(Type):
++    _toSchema = {'version': 'version'}
++    _toPy = {'version': 'version'}
++    def __init__(self, version=None, **unknown_fields):
++        '''
++        version : Number
++        '''
++        self.version = Number.from_json(version) if version else None
++
++
++
++class AllWatcherId(Type):
++    _toSchema = {'watcher_id': 'watcher-id'}
++    _toPy = {'watcher-id': 'watcher_id'}
++    def __init__(self, watcher_id=None, **unknown_fields):
++        '''
++        watcher_id : str
++        '''
++        self.watcher_id = watcher_id
++
++
++
++class AllWatcherNextResults(Type):
++    _toSchema = {'deltas': 'deltas'}
++    _toPy = {'deltas': 'deltas'}
++    def __init__(self, deltas=None, **unknown_fields):
++        '''
++        deltas : typing.Sequence<+T_co>[~Delta]<~Delta>
++        '''
++        self.deltas = [Delta.from_json(o) for o in deltas or []]
++
++
++
++class AnnotationsGetResult(Type):
++    _toSchema = {'annotations': 'annotations', 'entity': 'entity', 'error': 'error'}
++    _toPy = {'annotations': 'annotations', 'entity': 'entity', 'error': 'error'}
++    def __init__(self, annotations=None, entity=None, error=None, **unknown_fields):
++        '''
++        annotations : typing.Mapping<~KT, +VT_co>[str, str]
++        entity : str
++        error : ErrorResult
++        '''
++        self.annotations = annotations
++        self.entity = entity
++        self.error = ErrorResult.from_json(error) if error else None
++
++
++
++class AnnotationsGetResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~AnnotationsGetResult]<~AnnotationsGetResult>
++        '''
++        self.results = [AnnotationsGetResult.from_json(o) for o in results or []]
++
++
++
++class AnnotationsSet(Type):
++    _toSchema = {'annotations': 'annotations'}
++    _toPy = {'annotations': 'annotations'}
++    def __init__(self, annotations=None, **unknown_fields):
++        '''
++        annotations : typing.Sequence<+T_co>[~EntityAnnotations]<~EntityAnnotations>
++        '''
++        self.annotations = [EntityAnnotations.from_json(o) for o in annotations or []]
++
++
++
++class ApplicationCharmActionsResult(Type):
++    _toSchema = {'actions': 'actions', 'application_tag': 'application-tag', 'error': 'error'}
++    _toPy = {'actions': 'actions', 'application-tag': 'application_tag', 'error': 'error'}
++    def __init__(self, actions=None, application_tag=None, error=None, **unknown_fields):
++        '''
++        actions : typing.Mapping<~KT, +VT_co>[str, ~ActionSpec]<~ActionSpec>
++        application_tag : str
++        error : Error
++        '''
++        self.actions = actions
++        self.application_tag = application_tag
++        self.error = Error.from_json(error) if error else None
++
++
++
++class ApplicationCharmRelations(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class ApplicationCharmRelationsResults(Type):
++    _toSchema = {'charm_relations': 'charm-relations'}
++    _toPy = {'charm-relations': 'charm_relations'}
++    def __init__(self, charm_relations=None, **unknown_fields):
++        '''
++        charm_relations : typing.Sequence<+T_co>[str]
++        '''
++        self.charm_relations = charm_relations
++
++
++
++class ApplicationDeploy(Type):
++    _toSchema = {'application': 'application', 'channel': 'channel', 'charm_url': 'charm-url', 'config': 'config', 'config_yaml': 'config-yaml', 'constraints': 'constraints', 'endpoint_bindings': 'endpoint-bindings', 'num_units': 'num-units', 'placement': 'placement', 'resources': 'resources', 'series': 'series', 'storage': 'storage'}
++    _toPy = {'application': 'application', 'channel': 'channel', 'charm-url': 'charm_url', 'config': 'config', 'config-yaml': 'config_yaml', 'constraints': 'constraints', 'endpoint-bindings': 'endpoint_bindings', 'num-units': 'num_units', 'placement': 'placement', 'resources': 'resources', 'series': 'series', 'storage': 'storage'}
++    def __init__(self, application=None, channel=None, charm_url=None, config=None, config_yaml=None, constraints=None, endpoint_bindings=None, num_units=None, placement=None, resources=None, series=None, storage=None, **unknown_fields):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config : typing.Mapping<~KT, +VT_co>[str, str]
++        config_yaml : str
++        constraints : Value
++        endpoint_bindings : typing.Mapping<~KT, +VT_co>[str, str]
++        num_units : int
++        placement : typing.Sequence<+T_co>[~Placement]<~Placement>
++        resources : typing.Mapping<~KT, +VT_co>[str, str]
++        series : str
++        storage : typing.Mapping<~KT, +VT_co>[str, ~Constraints]<~Constraints>
++        '''
++        self.application = application
++        self.channel = channel
++        self.charm_url = charm_url
++        self.config = config
++        self.config_yaml = config_yaml
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.endpoint_bindings = endpoint_bindings
++        self.num_units = num_units
++        self.placement = [Placement.from_json(o) for o in placement or []]
++        self.resources = resources
++        self.series = series
++        self.storage = storage
++
++
++
++class ApplicationDestroy(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class ApplicationExpose(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class ApplicationGet(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class ApplicationGetResults(Type):
++    _toSchema = {'application': 'application', 'charm': 'charm', 'config': 'config', 'constraints': 'constraints', 'series': 'series'}
++    _toPy = {'application': 'application', 'charm': 'charm', 'config': 'config', 'constraints': 'constraints', 'series': 'series'}
++    def __init__(self, application=None, charm=None, config=None, constraints=None, series=None, **unknown_fields):
++        '''
++        application : str
++        charm : str
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        constraints : Value
++        series : str
++        '''
++        self.application = application
++        self.charm = charm
++        self.config = config
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.series = series
++
++
++
++class ApplicationMetricCredential(Type):
++    _toSchema = {'application': 'application', 'metrics_credentials': 'metrics-credentials'}
++    _toPy = {'application': 'application', 'metrics-credentials': 'metrics_credentials'}
++    def __init__(self, application=None, metrics_credentials=None, **unknown_fields):
++        '''
++        application : str
++        metrics_credentials : typing.Sequence<+T_co>[int]
++        '''
++        self.application = application
++        self.metrics_credentials = metrics_credentials
++
++
++
++class ApplicationMetricCredentials(Type):
++    _toSchema = {'creds': 'creds'}
++    _toPy = {'creds': 'creds'}
++    def __init__(self, creds=None, **unknown_fields):
++        '''
++        creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential>
++        '''
++        self.creds = [ApplicationMetricCredential.from_json(o) for o in creds or []]
++
++
++
++class ApplicationOffer(Type):
++    _toSchema = {'access': 'access', 'application_description': 'application-description', 'bindings': 'bindings', 'endpoints': 'endpoints', 'offer_name': 'offer-name', 'offer_url': 'offer-url', 'source_model_tag': 'source-model-tag', 'spaces': 'spaces'}
++    _toPy = {'access': 'access', 'application-description': 'application_description', 'bindings': 'bindings', 'endpoints': 'endpoints', 'offer-name': 'offer_name', 'offer-url': 'offer_url', 'source-model-tag': 'source_model_tag', 'spaces': 'spaces'}
++    def __init__(self, access=None, application_description=None, bindings=None, endpoints=None, offer_name=None, offer_url=None, source_model_tag=None, spaces=None, **unknown_fields):
++        '''
++        access : str
++        application_description : str
++        bindings : typing.Mapping<~KT, +VT_co>[str, str]
++        endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint>
++        offer_name : str
++        offer_url : str
++        source_model_tag : str
++        spaces : typing.Sequence<+T_co>[~RemoteSpace]<~RemoteSpace>
++        '''
++        self.access = access
++        self.application_description = application_description
++        self.bindings = bindings
++        self.endpoints = [RemoteEndpoint.from_json(o) for o in endpoints or []]
++        self.offer_name = offer_name
++        self.offer_url = offer_url
++        self.source_model_tag = source_model_tag
++        self.spaces = [RemoteSpace.from_json(o) for o in spaces or []]
++
++
++
++class ApplicationRelationsChange(Type):
++    _toSchema = {'changed': 'changed', 'removed': 'removed'}
++    _toPy = {'changed': 'changed', 'removed': 'removed'}
++    def __init__(self, changed=None, removed=None, **unknown_fields):
++        '''
++        changed : typing.Sequence<+T_co>[~RelationChange]<~RelationChange>
++        removed : typing.Sequence<+T_co>[int]
++        '''
++        self.changed = [RelationChange.from_json(o) for o in changed or []]
++        self.removed = removed
++
++
++
++class ApplicationRelationsWatchResult(Type):
++    _toSchema = {'applicationrelationswatcherid': 'ApplicationRelationsWatcherId', 'changes': 'changes', 'error': 'error'}
++    _toPy = {'ApplicationRelationsWatcherId': 'applicationrelationswatcherid', 'changes': 'changes', 'error': 'error'}
++    def __init__(self, applicationrelationswatcherid=None, changes=None, error=None, **unknown_fields):
++        '''
++        applicationrelationswatcherid : str
++        changes : ApplicationRelationsChange
++        error : Error
++        '''
++        self.applicationrelationswatcherid = applicationrelationswatcherid
++        self.changes = ApplicationRelationsChange.from_json(changes) if changes else None
++        self.error = Error.from_json(error) if error else None
++
++
++
++class ApplicationSet(Type):
++    _toSchema = {'application': 'application', 'options': 'options'}
++    _toPy = {'application': 'application', 'options': 'options'}
++    def __init__(self, application=None, options=None, **unknown_fields):
++        '''
++        application : str
++        options : typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        self.application = application
++        self.options = options
++
++
++
++class ApplicationSetCharm(Type):
++    _toSchema = {'application': 'application', 'channel': 'channel', 'charm_url': 'charm-url', 'config_settings': 'config-settings', 'config_settings_yaml': 'config-settings-yaml', 'force_series': 'force-series', 'force_units': 'force-units', 'resource_ids': 'resource-ids', 'storage_constraints': 'storage-constraints'}
++    _toPy = {'application': 'application', 'channel': 'channel', 'charm-url': 'charm_url', 'config-settings': 'config_settings', 'config-settings-yaml': 'config_settings_yaml', 'force-series': 'force_series', 'force-units': 'force_units', 'resource-ids': 'resource_ids', 'storage-constraints': 'storage_constraints'}
++    def __init__(self, application=None, channel=None, charm_url=None, config_settings=None, config_settings_yaml=None, force_series=None, force_units=None, resource_ids=None, storage_constraints=None, **unknown_fields):
++        '''
++        application : str
++        channel : str
++        charm_url : str
++        config_settings : typing.Mapping<~KT, +VT_co>[str, str]
++        config_settings_yaml : str
++        force_series : bool
++        force_units : bool
++        resource_ids : typing.Mapping<~KT, +VT_co>[str, str]
++        storage_constraints : typing.Mapping<~KT, +VT_co>[str, ~StorageConstraints]<~StorageConstraints>
++        '''
++        self.application = application
++        self.channel = channel
++        self.charm_url = charm_url
++        self.config_settings = config_settings
++        self.config_settings_yaml = config_settings_yaml
++        self.force_series = force_series
++        self.force_units = force_units
++        self.resource_ids = resource_ids
++        self.storage_constraints = storage_constraints
++
++
++
++class ApplicationStatus(Type):
++    _toSchema = {'can_upgrade_to': 'can-upgrade-to', 'charm': 'charm', 'err': 'err', 'exposed': 'exposed', 'life': 'life', 'meter_statuses': 'meter-statuses', 'relations': 'relations', 'series': 'series', 'status': 'status', 'subordinate_to': 'subordinate-to', 'units': 'units', 'workload_version': 'workload-version'}
++    _toPy = {'can-upgrade-to': 'can_upgrade_to', 'charm': 'charm', 'err': 'err', 'exposed': 'exposed', 'life': 'life', 'meter-statuses': 'meter_statuses', 'relations': 'relations', 'series': 'series', 'status': 'status', 'subordinate-to': 'subordinate_to', 'units': 'units', 'workload-version': 'workload_version'}
++    def __init__(self, can_upgrade_to=None, charm=None, err=None, exposed=None, life=None, meter_statuses=None, relations=None, series=None, status=None, subordinate_to=None, units=None, workload_version=None, **unknown_fields):
++        '''
++        can_upgrade_to : str
++        charm : str
++        err : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        exposed : bool
++        life : str
++        meter_statuses : typing.Mapping<~KT, +VT_co>[str, ~MeterStatus]<~MeterStatus>
++        relations : typing.Sequence<+T_co>[str]
++        series : str
++        status : DetailedStatus
++        subordinate_to : typing.Sequence<+T_co>[str]
++        units : typing.Mapping<~KT, +VT_co>[str, ~UnitStatus]<~UnitStatus>
++        workload_version : str
++        '''
++        self.can_upgrade_to = can_upgrade_to
++        self.charm = charm
++        self.err = err
++        self.exposed = exposed
++        self.life = life
++        self.meter_statuses = meter_statuses
++        self.relations = relations
++        self.series = series
++        self.status = DetailedStatus.from_json(status) if status else None
++        self.subordinate_to = subordinate_to
++        self.units = units
++        self.workload_version = workload_version
++
++
++
++class ApplicationStatusResult(Type):
++    _toSchema = {'application': 'application', 'error': 'error', 'units': 'units'}
++    _toPy = {'application': 'application', 'error': 'error', 'units': 'units'}
++    def __init__(self, application=None, error=None, units=None, **unknown_fields):
++        '''
++        application : StatusResult
++        error : Error
++        units : typing.Mapping<~KT, +VT_co>[str, ~StatusResult]<~StatusResult>
++        '''
++        self.application = StatusResult.from_json(application) if application else None
++        self.error = Error.from_json(error) if error else None
++        self.units = units
++
++
++
++class ApplicationStatusResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult>
++        '''
++        self.results = [ApplicationStatusResult.from_json(o) for o in results or []]
++
++
++
++class ApplicationTag(Type):
++    _toSchema = {'name': 'Name'}
++    _toPy = {'Name': 'name'}
++    def __init__(self, name=None, **unknown_fields):
++        '''
++        name : str
++        '''
++        self.name = name
++
++
++
++class ApplicationURLs(Type):
++    _toSchema = {'application_urls': 'application-urls'}
++    _toPy = {'application-urls': 'application_urls'}
++    def __init__(self, application_urls=None, **unknown_fields):
++        '''
++        application_urls : typing.Sequence<+T_co>[str]
++        '''
++        self.application_urls = application_urls
++
++
++
++class ApplicationUnexpose(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class ApplicationUnset(Type):
++    _toSchema = {'application': 'application', 'options': 'options'}
++    _toPy = {'application': 'application', 'options': 'options'}
++    def __init__(self, application=None, options=None, **unknown_fields):
++        '''
++        application : str
++        options : typing.Sequence<+T_co>[str]
++        '''
++        self.application = application
++        self.options = options
++
++
++
++class ApplicationUpdate(Type):
++    _toSchema = {'application': 'application', 'charm_url': 'charm-url', 'constraints': 'constraints', 'force_charm_url': 'force-charm-url', 'force_series': 'force-series', 'min_units': 'min-units', 'settings': 'settings', 'settings_yaml': 'settings-yaml'}
++    _toPy = {'application': 'application', 'charm-url': 'charm_url', 'constraints': 'constraints', 'force-charm-url': 'force_charm_url', 'force-series': 'force_series', 'min-units': 'min_units', 'settings': 'settings', 'settings-yaml': 'settings_yaml'}
++    def __init__(self, application=None, charm_url=None, constraints=None, force_charm_url=None, force_series=None, min_units=None, settings=None, settings_yaml=None, **unknown_fields):
++        '''
++        application : str
++        charm_url : str
++        constraints : Value
++        force_charm_url : bool
++        force_series : bool
++        min_units : int
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        settings_yaml : str
++        '''
++        self.application = application
++        self.charm_url = charm_url
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.force_charm_url = force_charm_url
++        self.force_series = force_series
++        self.min_units = min_units
++        self.settings = settings
++        self.settings_yaml = settings_yaml
++
++
++
++class ApplicationsCharmActionsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ApplicationCharmActionsResult]<~ApplicationCharmActionsResult>
++        '''
++        self.results = [ApplicationCharmActionsResult.from_json(o) for o in results or []]
++
++
++
++class ApplicationsDeploy(Type):
++    _toSchema = {'applications': 'applications'}
++    _toPy = {'applications': 'applications'}
++    def __init__(self, applications=None, **unknown_fields):
++        '''
++        applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy>
++        '''
++        self.applications = [ApplicationDeploy.from_json(o) for o in applications or []]
++
++
++
++class BackupsCreateArgs(Type):
++    _toSchema = {'notes': 'notes'}
++    _toPy = {'notes': 'notes'}
++    def __init__(self, notes=None, **unknown_fields):
++        '''
++        notes : str
++        '''
++        self.notes = notes
++
++
++
++class BackupsInfoArgs(Type):
++    _toSchema = {'id_': 'id'}
++    _toPy = {'id': 'id_'}
++    def __init__(self, id_=None, **unknown_fields):
++        '''
++        id_ : str
++        '''
++        self.id_ = id_
++
++
++
++class BackupsListArgs(Type):
++    _toSchema = {}
++    _toPy = {}
++    def __init__(self, **unknown_fields):
++        '''
++
++        '''
++        pass
++
++
++
++class BackupsListResult(Type):
++    _toSchema = {'list_': 'list'}
++    _toPy = {'list': 'list_'}
++    def __init__(self, list_=None, **unknown_fields):
++        '''
++        list_ : typing.Sequence<+T_co>[~BackupsMetadataResult]<~BackupsMetadataResult>
++        '''
++        self.list_ = [BackupsMetadataResult.from_json(o) for o in list_ or []]
++
++
++
++class BackupsMetadataResult(Type):
++    _toSchema = {'ca_cert': 'ca-cert', 'ca_private_key': 'ca-private-key', 'checksum': 'checksum', 'checksum_format': 'checksum-format', 'finished': 'finished', 'hostname': 'hostname', 'id_': 'id', 'machine': 'machine', 'model': 'model', 'notes': 'notes', 'series': 'series', 'size': 'size', 'started': 'started', 'stored': 'stored', 'version': 'version'}
++    _toPy = {'ca-cert': 'ca_cert', 'ca-private-key': 'ca_private_key', 'checksum': 'checksum', 'checksum-format': 'checksum_format', 'finished': 'finished', 'hostname': 'hostname', 'id': 'id_', 'machine': 'machine', 'model': 'model', 'notes': 'notes', 'series': 'series', 'size': 'size', 'started': 'started', 'stored': 'stored', 'version': 'version'}
++    def __init__(self, ca_cert=None, ca_private_key=None, checksum=None, checksum_format=None, finished=None, hostname=None, id_=None, machine=None, model=None, notes=None, series=None, size=None, started=None, stored=None, version=None, **unknown_fields):
++        '''
++        ca_cert : str
++        ca_private_key : str
++        checksum : str
++        checksum_format : str
++        finished : str
++        hostname : str
++        id_ : str
++        machine : str
++        model : str
++        notes : str
++        series : str
++        size : int
++        started : str
++        stored : str
++        version : Number
++        '''
++        self.ca_cert = ca_cert
++        self.ca_private_key = ca_private_key
++        self.checksum = checksum
++        self.checksum_format = checksum_format
++        self.finished = finished
++        self.hostname = hostname
++        self.id_ = id_
++        self.machine = machine
++        self.model = model
++        self.notes = notes
++        self.series = series
++        self.size = size
++        self.started = started
++        self.stored = stored
++        self.version = Number.from_json(version) if version else None
++
++
++
++class BackupsRemoveArgs(Type):
++    _toSchema = {'id_': 'id'}
++    _toPy = {'id': 'id_'}
++    def __init__(self, id_=None, **unknown_fields):
++        '''
++        id_ : str
++        '''
++        self.id_ = id_
++
++
++
++class Binary(Type):
++    _toSchema = {'arch': 'Arch', 'number': 'Number', 'series': 'Series'}
++    _toPy = {'Arch': 'arch', 'Number': 'number', 'Series': 'series'}
++    def __init__(self, arch=None, number=None, series=None, **unknown_fields):
++        '''
++        arch : str
++        number : Number
++        series : str
++        '''
++        self.arch = arch
++        self.number = Number.from_json(number) if number else None
++        self.series = series
++
++
++
++class Block(Type):
++    _toSchema = {'id_': 'id', 'message': 'message', 'tag': 'tag', 'type_': 'type'}
++    _toPy = {'id': 'id_', 'message': 'message', 'tag': 'tag', 'type': 'type_'}
++    def __init__(self, id_=None, message=None, tag=None, type_=None, **unknown_fields):
++        '''
++        id_ : str
++        message : str
++        tag : str
++        type_ : str
++        '''
++        self.id_ = id_
++        self.message = message
++        self.tag = tag
++        self.type_ = type_
++
++
++
++class BlockDevice(Type):
++    _toSchema = {'busaddress': 'BusAddress', 'devicelinks': 'DeviceLinks', 'devicename': 'DeviceName', 'filesystemtype': 'FilesystemType', 'hardwareid': 'HardwareId', 'inuse': 'InUse', 'label': 'Label', 'mountpoint': 'MountPoint', 'size': 'Size', 'uuid': 'UUID'}
++    _toPy = {'BusAddress': 'busaddress', 'DeviceLinks': 'devicelinks', 'DeviceName': 'devicename', 'FilesystemType': 'filesystemtype', 'HardwareId': 'hardwareid', 'InUse': 'inuse', 'Label': 'label', 'MountPoint': 'mountpoint', 'Size': 'size', 'UUID': 'uuid'}
++    def __init__(self, busaddress=None, devicelinks=None, devicename=None, filesystemtype=None, hardwareid=None, inuse=None, label=None, mountpoint=None, size=None, uuid=None, **unknown_fields):
++        '''
++        busaddress : str
++        devicelinks : typing.Sequence<+T_co>[str]
++        devicename : str
++        filesystemtype : str
++        hardwareid : str
++        inuse : bool
++        label : str
++        mountpoint : str
++        size : int
++        uuid : str
++        '''
++        self.busaddress = busaddress
++        self.devicelinks = devicelinks
++        self.devicename = devicename
++        self.filesystemtype = filesystemtype
++        self.hardwareid = hardwareid
++        self.inuse = inuse
++        self.label = label
++        self.mountpoint = mountpoint
++        self.size = size
++        self.uuid = uuid
++
++
++
++class BlockDeviceResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : BlockDevice
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = BlockDevice.from_json(result) if result else None
++
++
++
++class BlockDeviceResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~BlockDeviceResult]<~BlockDeviceResult>
++        '''
++        self.results = [BlockDeviceResult.from_json(o) for o in results or []]
++
++
++
++class BlockResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : Block
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = Block.from_json(result) if result else None
++
++
++
++class BlockResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~BlockResult]<~BlockResult>
++        '''
++        self.results = [BlockResult.from_json(o) for o in results or []]
++
++
++
++class BlockSwitchParams(Type):
++    _toSchema = {'message': 'message', 'type_': 'type'}
++    _toPy = {'message': 'message', 'type': 'type_'}
++    def __init__(self, message=None, type_=None, **unknown_fields):
++        '''
++        message : str
++        type_ : str
++        '''
++        self.message = message
++        self.type_ = type_
++
++
++
++class BoolResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : bool
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class BoolResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~BoolResult]<~BoolResult>
++        '''
++        self.results = [BoolResult.from_json(o) for o in results or []]
++
++
++
++class BundleChange(Type):
++    _toSchema = {'args': 'args', 'id_': 'id', 'method': 'method', 'requires': 'requires'}
++    _toPy = {'args': 'args', 'id': 'id_', 'method': 'method', 'requires': 'requires'}
++    def __init__(self, args=None, id_=None, method=None, requires=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[typing.Any]
++        id_ : str
++        method : str
++        requires : typing.Sequence<+T_co>[str]
++        '''
++        self.args = args
++        self.id_ = id_
++        self.method = method
++        self.requires = requires
++
++
++
++class BundleChangesParams(Type):
++    _toSchema = {'yaml': 'yaml'}
++    _toPy = {'yaml': 'yaml'}
++    def __init__(self, yaml=None, **unknown_fields):
++        '''
++        yaml : str
++        '''
++        self.yaml = yaml
++
++
++
++class BundleChangesResults(Type):
++    _toSchema = {'changes': 'changes', 'errors': 'errors'}
++    _toPy = {'changes': 'changes', 'errors': 'errors'}
++    def __init__(self, changes=None, errors=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[~BundleChange]<~BundleChange>
++        errors : typing.Sequence<+T_co>[str]
++        '''
++        self.changes = [BundleChange.from_json(o) for o in changes or []]
++        self.errors = errors
++
++
++
++class BytesResult(Type):
++    _toSchema = {'result': 'result'}
++    _toPy = {'result': 'result'}
++    def __init__(self, result=None, **unknown_fields):
++        '''
++        result : typing.Sequence<+T_co>[int]
++        '''
++        self.result = result
++
++
++
++class CharmActionSpec(Type):
++    _toSchema = {'description': 'description', 'params': 'params'}
++    _toPy = {'description': 'description', 'params': 'params'}
++    def __init__(self, description=None, params=None, **unknown_fields):
++        '''
++        description : str
++        params : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.description = description
++        self.params = params
++
++
++
++class CharmActions(Type):
++    _toSchema = {'specs': 'specs'}
++    _toPy = {'specs': 'specs'}
++    def __init__(self, specs=None, **unknown_fields):
++        '''
++        specs : typing.Mapping<~KT, +VT_co>[str, ~CharmActionSpec]<~CharmActionSpec>
++        '''
++        self.specs = specs
++
++
++
++class CharmInfo(Type):
++    _toSchema = {'actions': 'actions', 'config': 'config', 'meta': 'meta', 'metrics': 'metrics', 'revision': 'revision', 'url': 'url'}
++    _toPy = {'actions': 'actions', 'config': 'config', 'meta': 'meta', 'metrics': 'metrics', 'revision': 'revision', 'url': 'url'}
++    def __init__(self, actions=None, config=None, meta=None, metrics=None, revision=None, url=None, **unknown_fields):
++        '''
++        actions : CharmActions
++        config : typing.Mapping<~KT, +VT_co>[str, ~CharmOption]<~CharmOption>
++        meta : CharmMeta
++        metrics : CharmMetrics
++        revision : int
++        url : str
++        '''
++        self.actions = CharmActions.from_json(actions) if actions else None
++        self.config = config
++        self.meta = CharmMeta.from_json(meta) if meta else None
++        self.metrics = CharmMetrics.from_json(metrics) if metrics else None
++        self.revision = revision
++        self.url = url
++
++
++
++class CharmMeta(Type):
++    _toSchema = {'categories': 'categories', 'description': 'description', 'extra_bindings': 'extra-bindings', 'min_juju_version': 'min-juju-version', 'name': 'name', 'payload_classes': 'payload-classes', 'peers': 'peers', 'provides': 'provides', 'requires': 'requires', 'resources': 'resources', 'series': 'series', 'storage': 'storage', 'subordinate': 'subordinate', 'summary': 'summary', 'tags': 'tags', 'terms': 'terms'}
++    _toPy = {'categories': 'categories', 'description': 'description', 'extra-bindings': 'extra_bindings', 'min-juju-version': 'min_juju_version', 'name': 'name', 'payload-classes': 'payload_classes', 'peers': 'peers', 'provides': 'provides', 'requires': 'requires', 'resources': 'resources', 'series': 'series', 'storage': 'storage', 'subordinate': 'subordinate', 'summary': 'summary', 'tags': 'tags', 'terms': 'terms'}
++    def __init__(self, categories=None, description=None, extra_bindings=None, min_juju_version=None, name=None, payload_classes=None, peers=None, provides=None, requires=None, resources=None, series=None, storage=None, subordinate=None, summary=None, tags=None, terms=None, **unknown_fields):
++        '''
++        categories : typing.Sequence<+T_co>[str]
++        description : str
++        extra_bindings : typing.Mapping<~KT, +VT_co>[str, str]
++        min_juju_version : str
++        name : str
++        payload_classes : typing.Mapping<~KT, +VT_co>[str, ~CharmPayloadClass]<~CharmPayloadClass>
++        peers : typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        provides : typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        requires : typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation>
++        resources : typing.Mapping<~KT, +VT_co>[str, ~CharmResourceMeta]<~CharmResourceMeta>
++        series : typing.Sequence<+T_co>[str]
++        storage : typing.Mapping<~KT, +VT_co>[str, ~CharmStorage]<~CharmStorage>
++        subordinate : bool
++        summary : str
++        tags : typing.Sequence<+T_co>[str]
++        terms : typing.Sequence<+T_co>[str]
++        '''
++        self.categories = categories
++        self.description = description
++        self.extra_bindings = extra_bindings
++        self.min_juju_version = min_juju_version
++        self.name = name
++        self.payload_classes = payload_classes
++        self.peers = peers
++        self.provides = provides
++        self.requires = requires
++        self.resources = resources
++        self.series = series
++        self.storage = storage
++        self.subordinate = subordinate
++        self.summary = summary
++        self.tags = tags
++        self.terms = terms
++
++
++
++class CharmMetric(Type):
++    _toSchema = {'description': 'description', 'type_': 'type'}
++    _toPy = {'description': 'description', 'type': 'type_'}
++    def __init__(self, description=None, type_=None, **unknown_fields):
++        '''
++        description : str
++        type_ : str
++        '''
++        self.description = description
++        self.type_ = type_
++
++
++
++class CharmMetrics(Type):
++    _toSchema = {'metrics': 'metrics', 'plan': 'plan'}
++    _toPy = {'metrics': 'metrics', 'plan': 'plan'}
++    def __init__(self, metrics=None, plan=None, **unknown_fields):
++        '''
++        metrics : typing.Mapping<~KT, +VT_co>[str, ~CharmMetric]<~CharmMetric>
++        plan : CharmPlan
++        '''
++        self.metrics = metrics
++        self.plan = CharmPlan.from_json(plan) if plan else None
++
++
++
++class CharmOption(Type):
++    _toSchema = {'default': 'default', 'description': 'description', 'type_': 'type'}
++    _toPy = {'default': 'default', 'description': 'description', 'type': 'type_'}
++    def __init__(self, default=None, description=None, type_=None, **unknown_fields):
++        '''
++        default : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        description : str
++        type_ : str
++        '''
++        self.default = default
++        self.description = description
++        self.type_ = type_
++
++
++
++class CharmPayloadClass(Type):
++    _toSchema = {'name': 'name', 'type_': 'type'}
++    _toPy = {'name': 'name', 'type': 'type_'}
++    def __init__(self, name=None, type_=None, **unknown_fields):
++        '''
++        name : str
++        type_ : str
++        '''
++        self.name = name
++        self.type_ = type_
++
++
++
++class CharmPlan(Type):
++    _toSchema = {'required': 'required'}
++    _toPy = {'required': 'required'}
++    def __init__(self, required=None, **unknown_fields):
++        '''
++        required : bool
++        '''
++        self.required = required
++
++
++
++class CharmRelation(Type):
++    _toSchema = {'interface': 'interface', 'limit': 'limit', 'name': 'name', 'optional': 'optional', 'role': 'role', 'scope': 'scope'}
++    _toPy = {'interface': 'interface', 'limit': 'limit', 'name': 'name', 'optional': 'optional', 'role': 'role', 'scope': 'scope'}
++    def __init__(self, interface=None, limit=None, name=None, optional=None, role=None, scope=None, **unknown_fields):
++        '''
++        interface : str
++        limit : int
++        name : str
++        optional : bool
++        role : str
++        scope : str
++        '''
++        self.interface = interface
++        self.limit = limit
++        self.name = name
++        self.optional = optional
++        self.role = role
++        self.scope = scope
++
++
++
++class CharmResource(Type):
++    _toSchema = {'description': 'description', 'fingerprint': 'fingerprint', 'name': 'name', 'origin': 'origin', 'path': 'path', 'revision': 'revision', 'size': 'size', 'type_': 'type'}
++    _toPy = {'description': 'description', 'fingerprint': 'fingerprint', 'name': 'name', 'origin': 'origin', 'path': 'path', 'revision': 'revision', 'size': 'size', 'type': 'type_'}
++    def __init__(self, description=None, fingerprint=None, name=None, origin=None, path=None, revision=None, size=None, type_=None, **unknown_fields):
++        '''
++        description : str
++        fingerprint : typing.Sequence<+T_co>[int]
++        name : str
++        origin : str
++        path : str
++        revision : int
++        size : int
++        type_ : str
++        '''
++        self.description = description
++        self.fingerprint = fingerprint
++        self.name = name
++        self.origin = origin
++        self.path = path
++        self.revision = revision
++        self.size = size
++        self.type_ = type_
++
++
++
++class CharmResourceMeta(Type):
++    _toSchema = {'description': 'description', 'name': 'name', 'path': 'path', 'type_': 'type'}
++    _toPy = {'description': 'description', 'name': 'name', 'path': 'path', 'type': 'type_'}
++    def __init__(self, description=None, name=None, path=None, type_=None, **unknown_fields):
++        '''
++        description : str
++        name : str
++        path : str
++        type_ : str
++        '''
++        self.description = description
++        self.name = name
++        self.path = path
++        self.type_ = type_
++
++
++
++class CharmStorage(Type):
++    _toSchema = {'count_max': 'count-max', 'count_min': 'count-min', 'description': 'description', 'location': 'location', 'minimum_size': 'minimum-size', 'name': 'name', 'properties': 'properties', 'read_only': 'read-only', 'shared': 'shared', 'type_': 'type'}
++    _toPy = {'count-max': 'count_max', 'count-min': 'count_min', 'description': 'description', 'location': 'location', 'minimum-size': 'minimum_size', 'name': 'name', 'properties': 'properties', 'read-only': 'read_only', 'shared': 'shared', 'type': 'type_'}
++    def __init__(self, count_max=None, count_min=None, description=None, location=None, minimum_size=None, name=None, properties=None, read_only=None, shared=None, type_=None, **unknown_fields):
++        '''
++        count_max : int
++        count_min : int
++        description : str
++        location : str
++        minimum_size : int
++        name : str
++        properties : typing.Sequence<+T_co>[str]
++        read_only : bool
++        shared : bool
++        type_ : str
++        '''
++        self.count_max = count_max
++        self.count_min = count_min
++        self.description = description
++        self.location = location
++        self.minimum_size = minimum_size
++        self.name = name
++        self.properties = properties
++        self.read_only = read_only
++        self.shared = shared
++        self.type_ = type_
++
++
++
++class CharmURL(Type):
++    _toSchema = {'url': 'url'}
++    _toPy = {'url': 'url'}
++    def __init__(self, url=None, **unknown_fields):
++        '''
++        url : str
++        '''
++        self.url = url
++
++
++
++class CharmURLs(Type):
++    _toSchema = {'urls': 'urls'}
++    _toPy = {'urls': 'urls'}
++    def __init__(self, urls=None, **unknown_fields):
++        '''
++        urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL>
++        '''
++        self.urls = [CharmURL.from_json(o) for o in urls or []]
++
++
++
++class CharmsList(Type):
++    _toSchema = {'names': 'names'}
++    _toPy = {'names': 'names'}
++    def __init__(self, names=None, **unknown_fields):
++        '''
++        names : typing.Sequence<+T_co>[str]
++        '''
++        self.names = names
++
++
++
++class CharmsListResult(Type):
++    _toSchema = {'charm_urls': 'charm-urls'}
++    _toPy = {'charm-urls': 'charm_urls'}
++    def __init__(self, charm_urls=None, **unknown_fields):
++        '''
++        charm_urls : typing.Sequence<+T_co>[str]
++        '''
++        self.charm_urls = charm_urls
++
++
++
++class ClaimLeadershipBulkParams(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~ClaimLeadershipParams]<~ClaimLeadershipParams>
++        '''
++        self.params = [ClaimLeadershipParams.from_json(o) for o in params or []]
++
++
++
++class ClaimLeadershipBulkResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        self.results = [ErrorResult.from_json(o) for o in results or []]
++
++
++
++class ClaimLeadershipParams(Type):
++    _toSchema = {'application_tag': 'application-tag', 'duration': 'duration', 'unit_tag': 'unit-tag'}
++    _toPy = {'application-tag': 'application_tag', 'duration': 'duration', 'unit-tag': 'unit_tag'}
++    def __init__(self, application_tag=None, duration=None, unit_tag=None, **unknown_fields):
++        '''
++        application_tag : str
++        duration : float
++        unit_tag : str
++        '''
++        self.application_tag = application_tag
++        self.duration = duration
++        self.unit_tag = unit_tag
++
++
++
++class Cloud(Type):
++    _toSchema = {'auth_types': 'auth-types', 'endpoint': 'endpoint', 'identity_endpoint': 'identity-endpoint', 'regions': 'regions', 'storage_endpoint': 'storage-endpoint', 'type_': 'type'}
++    _toPy = {'auth-types': 'auth_types', 'endpoint': 'endpoint', 'identity-endpoint': 'identity_endpoint', 'regions': 'regions', 'storage-endpoint': 'storage_endpoint', 'type': 'type_'}
++    def __init__(self, auth_types=None, endpoint=None, identity_endpoint=None, regions=None, storage_endpoint=None, type_=None, **unknown_fields):
++        '''
++        auth_types : typing.Sequence<+T_co>[str]
++        endpoint : str
++        identity_endpoint : str
++        regions : typing.Sequence<+T_co>[~CloudRegion]<~CloudRegion>
++        storage_endpoint : str
++        type_ : str
++        '''
++        self.auth_types = auth_types
++        self.endpoint = endpoint
++        self.identity_endpoint = identity_endpoint
++        self.regions = [CloudRegion.from_json(o) for o in regions or []]
++        self.storage_endpoint = storage_endpoint
++        self.type_ = type_
++
++
++
++class CloudCredential(Type):
++    _toSchema = {'attrs': 'attrs', 'auth_type': 'auth-type', 'redacted': 'redacted'}
++    _toPy = {'attrs': 'attrs', 'auth-type': 'auth_type', 'redacted': 'redacted'}
++    def __init__(self, attrs=None, auth_type=None, redacted=None, **unknown_fields):
++        '''
++        attrs : typing.Mapping<~KT, +VT_co>[str, str]
++        auth_type : str
++        redacted : typing.Sequence<+T_co>[str]
++        '''
++        self.attrs = attrs
++        self.auth_type = auth_type
++        self.redacted = redacted
++
++
++
++class CloudCredentialResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : CloudCredential
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = CloudCredential.from_json(result) if result else None
++
++
++
++class CloudCredentialResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~CloudCredentialResult]<~CloudCredentialResult>
++        '''
++        self.results = [CloudCredentialResult.from_json(o) for o in results or []]
++
++
++
++class CloudImageMetadata(Type):
++    _toSchema = {'arch': 'arch', 'image_id': 'image-id', 'priority': 'priority', 'region': 'region', 'root_storage_size': 'root-storage-size', 'root_storage_type': 'root-storage-type', 'series': 'series', 'source': 'source', 'stream': 'stream', 'version': 'version', 'virt_type': 'virt-type'}
++    _toPy = {'arch': 'arch', 'image-id': 'image_id', 'priority': 'priority', 'region': 'region', 'root-storage-size': 'root_storage_size', 'root-storage-type': 'root_storage_type', 'series': 'series', 'source': 'source', 'stream': 'stream', 'version': 'version', 'virt-type': 'virt_type'}
++    def __init__(self, arch=None, image_id=None, priority=None, region=None, root_storage_size=None, root_storage_type=None, series=None, source=None, stream=None, version=None, virt_type=None, **unknown_fields):
++        '''
++        arch : str
++        image_id : str
++        priority : int
++        region : str
++        root_storage_size : int
++        root_storage_type : str
++        series : str
++        source : str
++        stream : str
++        version : str
++        virt_type : str
++        '''
++        self.arch = arch
++        self.image_id = image_id
++        self.priority = priority
++        self.region = region
++        self.root_storage_size = root_storage_size
++        self.root_storage_type = root_storage_type
++        self.series = series
++        self.source = source
++        self.stream = stream
++        self.version = version
++        self.virt_type = virt_type
++
++
++
++class CloudImageMetadataList(Type):
++    _toSchema = {'metadata': 'metadata'}
++    _toPy = {'metadata': 'metadata'}
++    def __init__(self, metadata=None, **unknown_fields):
++        '''
++        metadata : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata>
++        '''
++        self.metadata = [CloudImageMetadata.from_json(o) for o in metadata or []]
++
++
++
++class CloudInstanceTypesConstraint(Type):
++    _toSchema = {'cloud_tag': 'cloud-tag', 'constraints': 'constraints', 'region': 'region'}
++    _toPy = {'cloud-tag': 'cloud_tag', 'constraints': 'constraints', 'region': 'region'}
++    def __init__(self, cloud_tag=None, constraints=None, region=None, **unknown_fields):
++        '''
++        cloud_tag : str
++        constraints : Value
++        region : str
++        '''
++        self.cloud_tag = cloud_tag
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.region = region
++
++
++
++class CloudInstanceTypesConstraints(Type):
++    _toSchema = {'constraints': 'constraints'}
++    _toPy = {'constraints': 'constraints'}
++    def __init__(self, constraints=None, **unknown_fields):
++        '''
++        constraints : typing.Sequence<+T_co>[~CloudInstanceTypesConstraint]<~CloudInstanceTypesConstraint>
++        '''
++        self.constraints = [CloudInstanceTypesConstraint.from_json(o) for o in constraints or []]
++
++
++
++class CloudRegion(Type):
++    _toSchema = {'endpoint': 'endpoint', 'identity_endpoint': 'identity-endpoint', 'name': 'name', 'storage_endpoint': 'storage-endpoint'}
++    _toPy = {'endpoint': 'endpoint', 'identity-endpoint': 'identity_endpoint', 'name': 'name', 'storage-endpoint': 'storage_endpoint'}
++    def __init__(self, endpoint=None, identity_endpoint=None, name=None, storage_endpoint=None, **unknown_fields):
++        '''
++        endpoint : str
++        identity_endpoint : str
++        name : str
++        storage_endpoint : str
++        '''
++        self.endpoint = endpoint
++        self.identity_endpoint = identity_endpoint
++        self.name = name
++        self.storage_endpoint = storage_endpoint
++
++
++
++class CloudResult(Type):
++    _toSchema = {'cloud': 'cloud', 'error': 'error'}
++    _toPy = {'cloud': 'cloud', 'error': 'error'}
++    def __init__(self, cloud=None, error=None, **unknown_fields):
++        '''
++        cloud : Cloud
++        error : Error
++        '''
++        self.cloud = Cloud.from_json(cloud) if cloud else None
++        self.error = Error.from_json(error) if error else None
++
++
++
++class CloudResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~CloudResult]<~CloudResult>
++        '''
++        self.results = [CloudResult.from_json(o) for o in results or []]
++
++
++
++class CloudSpec(Type):
++    _toSchema = {'credential': 'credential', 'endpoint': 'endpoint', 'identity_endpoint': 'identity-endpoint', 'name': 'name', 'region': 'region', 'storage_endpoint': 'storage-endpoint', 'type_': 'type'}
++    _toPy = {'credential': 'credential', 'endpoint': 'endpoint', 'identity-endpoint': 'identity_endpoint', 'name': 'name', 'region': 'region', 'storage-endpoint': 'storage_endpoint', 'type': 'type_'}
++    def __init__(self, credential=None, endpoint=None, identity_endpoint=None, name=None, region=None, storage_endpoint=None, type_=None, **unknown_fields):
++        '''
++        credential : CloudCredential
++        endpoint : str
++        identity_endpoint : str
++        name : str
++        region : str
++        storage_endpoint : str
++        type_ : str
++        '''
++        self.credential = CloudCredential.from_json(credential) if credential else None
++        self.endpoint = endpoint
++        self.identity_endpoint = identity_endpoint
++        self.name = name
++        self.region = region
++        self.storage_endpoint = storage_endpoint
++        self.type_ = type_
++
++
++
++class CloudSpecResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : CloudSpec
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = CloudSpec.from_json(result) if result else None
++
++
++
++class CloudSpecResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult>
++        '''
++        self.results = [CloudSpecResult.from_json(o) for o in results or []]
++
++
++
++class CloudsResult(Type):
++    _toSchema = {'clouds': 'clouds'}
++    _toPy = {'clouds': 'clouds'}
++    def __init__(self, clouds=None, **unknown_fields):
++        '''
++        clouds : typing.Mapping<~KT, +VT_co>[str, ~Cloud]<~Cloud>
++        '''
++        self.clouds = clouds
++
++
++
++class ConfigSettingsResult(Type):
++    _toSchema = {'error': 'error', 'settings': 'settings'}
++    _toPy = {'error': 'error', 'settings': 'settings'}
++    def __init__(self, error=None, settings=None, **unknown_fields):
++        '''
++        error : Error
++        settings : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.settings = settings
++
++
++
++class ConfigSettingsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult>
++        '''
++        self.results = [ConfigSettingsResult.from_json(o) for o in results or []]
++
++
++
++class ConfigValue(Type):
++    _toSchema = {'source': 'source', 'value': 'value'}
++    _toPy = {'source': 'source', 'value': 'value'}
++    def __init__(self, source=None, value=None, **unknown_fields):
++        '''
++        source : str
++        value : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.source = source
++        self.value = value
++
++
++
++class Constraints(Type):
++    _toSchema = {'count': 'Count', 'pool': 'Pool', 'size': 'Size'}
++    _toPy = {'Count': 'count', 'Pool': 'pool', 'Size': 'size'}
++    def __init__(self, count=None, pool=None, size=None, **unknown_fields):
++        '''
++        count : int
++        pool : str
++        size : int
++        '''
++        self.count = count
++        self.pool = pool
++        self.size = size
++
++
++
++class ConstraintsResult(Type):
++    _toSchema = {'constraints': 'constraints', 'error': 'error'}
++    _toPy = {'constraints': 'constraints', 'error': 'error'}
++    def __init__(self, constraints=None, error=None, **unknown_fields):
++        '''
++        constraints : Value
++        error : Error
++        '''
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.error = Error.from_json(error) if error else None
++
++
++
++class ConstraintsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ConstraintsResult]<~ConstraintsResult>
++        '''
++        self.results = [ConstraintsResult.from_json(o) for o in results or []]
++
++
++
++class ConsumeApplicationArg(Type):
++    _toSchema = {'application_alias': 'application-alias', 'application_url': 'application-url'}
++    _toPy = {'application-alias': 'application_alias', 'application-url': 'application_url'}
++    def __init__(self, application_alias=None, application_url=None, **unknown_fields):
++        '''
++        application_alias : str
++        application_url : str
++        '''
++        self.application_alias = application_alias
++        self.application_url = application_url
++
++
++
++class ConsumeApplicationArgs(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg>
++        '''
++        self.args = [ConsumeApplicationArg.from_json(o) for o in args or []]
++
++
++
++class ConsumeApplicationResult(Type):
++    _toSchema = {'error': 'error', 'local_name': 'local-name'}
++    _toPy = {'error': 'error', 'local-name': 'local_name'}
++    def __init__(self, error=None, local_name=None, **unknown_fields):
++        '''
++        error : Error
++        local_name : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.local_name = local_name
++
++
++
++class ConsumeApplicationResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ConsumeApplicationResult]<~ConsumeApplicationResult>
++        '''
++        self.results = [ConsumeApplicationResult.from_json(o) for o in results or []]
++
++
++
++class ContainerConfig(Type):
++    _toSchema = {'apt_mirror': 'apt-mirror', 'apt_proxy': 'apt-proxy', 'authorized_keys': 'authorized-keys', 'provider_type': 'provider-type', 'proxy': 'proxy', 'ssl_hostname_verification': 'ssl-hostname-verification', 'updatebehavior': 'UpdateBehavior'}
++    _toPy = {'UpdateBehavior': 'updatebehavior', 'apt-mirror': 'apt_mirror', 'apt-proxy': 'apt_proxy', 'authorized-keys': 'authorized_keys', 'provider-type': 'provider_type', 'proxy': 'proxy', 'ssl-hostname-verification': 'ssl_hostname_verification'}
++    def __init__(self, updatebehavior=None, apt_mirror=None, apt_proxy=None, authorized_keys=None, provider_type=None, proxy=None, ssl_hostname_verification=None, **unknown_fields):
++        '''
++        updatebehavior : UpdateBehavior
++        apt_mirror : str
++        apt_proxy : Settings
++        authorized_keys : str
++        provider_type : str
++        proxy : Settings
++        ssl_hostname_verification : bool
++        '''
++        self.updatebehavior = UpdateBehavior.from_json(updatebehavior) if updatebehavior else None
++        self.apt_mirror = apt_mirror
++        self.apt_proxy = Settings.from_json(apt_proxy) if apt_proxy else None
++        self.authorized_keys = authorized_keys
++        self.provider_type = provider_type
++        self.proxy = Settings.from_json(proxy) if proxy else None
++        self.ssl_hostname_verification = ssl_hostname_verification
++
++
++
++class ContainerManagerConfig(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        self.config = config
++
++
++
++class ContainerManagerConfigParams(Type):
++    _toSchema = {'type_': 'type'}
++    _toPy = {'type': 'type_'}
++    def __init__(self, type_=None, **unknown_fields):
++        '''
++        type_ : str
++        '''
++        self.type_ = type_
++
++
++
++class ControllerConfigResult(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.config = config
++
++
++
++class ControllersChangeResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : ControllersChanges
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = ControllersChanges.from_json(result) if result else None
++
++
++
++class ControllersChangeResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ControllersChangeResult]<~ControllersChangeResult>
++        '''
++        self.results = [ControllersChangeResult.from_json(o) for o in results or []]
++
++
++
++class ControllersChanges(Type):
++    _toSchema = {'added': 'added', 'converted': 'converted', 'demoted': 'demoted', 'maintained': 'maintained', 'promoted': 'promoted', 'removed': 'removed'}
++    _toPy = {'added': 'added', 'converted': 'converted', 'demoted': 'demoted', 'maintained': 'maintained', 'promoted': 'promoted', 'removed': 'removed'}
++    def __init__(self, added=None, converted=None, demoted=None, maintained=None, promoted=None, removed=None, **unknown_fields):
++        '''
++        added : typing.Sequence<+T_co>[str]
++        converted : typing.Sequence<+T_co>[str]
++        demoted : typing.Sequence<+T_co>[str]
++        maintained : typing.Sequence<+T_co>[str]
++        promoted : typing.Sequence<+T_co>[str]
++        removed : typing.Sequence<+T_co>[str]
++        '''
++        self.added = added
++        self.converted = converted
++        self.demoted = demoted
++        self.maintained = maintained
++        self.promoted = promoted
++        self.removed = removed
++
++
++
++class ControllersSpec(Type):
++    _toSchema = {'constraints': 'constraints', 'num_controllers': 'num-controllers', 'placement': 'placement', 'series': 'series'}
++    _toPy = {'constraints': 'constraints', 'num-controllers': 'num_controllers', 'placement': 'placement', 'series': 'series'}
++    def __init__(self, constraints=None, num_controllers=None, placement=None, series=None, **unknown_fields):
++        '''
++        constraints : Value
++        num_controllers : int
++        placement : typing.Sequence<+T_co>[str]
++        series : str
++        '''
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.num_controllers = num_controllers
++        self.placement = placement
++        self.series = series
++
++
++
++class ControllersSpecs(Type):
++    _toSchema = {'specs': 'specs'}
++    _toPy = {'specs': 'specs'}
++    def __init__(self, specs=None, **unknown_fields):
++        '''
++        specs : typing.Sequence<+T_co>[~ControllersSpec]<~ControllersSpec>
++        '''
++        self.specs = [ControllersSpec.from_json(o) for o in specs or []]
++
++
++
++class CreateSpaceParams(Type):
++    _toSchema = {'provider_id': 'provider-id', 'public': 'public', 'space_tag': 'space-tag', 'subnet_tags': 'subnet-tags'}
++    _toPy = {'provider-id': 'provider_id', 'public': 'public', 'space-tag': 'space_tag', 'subnet-tags': 'subnet_tags'}
++    def __init__(self, provider_id=None, public=None, space_tag=None, subnet_tags=None, **unknown_fields):
++        '''
++        provider_id : str
++        public : bool
++        space_tag : str
++        subnet_tags : typing.Sequence<+T_co>[str]
++        '''
++        self.provider_id = provider_id
++        self.public = public
++        self.space_tag = space_tag
++        self.subnet_tags = subnet_tags
++
++
++
++class CreateSpacesParams(Type):
++    _toSchema = {'spaces': 'spaces'}
++    _toPy = {'spaces': 'spaces'}
++    def __init__(self, spaces=None, **unknown_fields):
++        '''
++        spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams>
++        '''
++        self.spaces = [CreateSpaceParams.from_json(o) for o in spaces or []]
++
++
++
++class Delta(Type):
++    _toSchema = {'entity': 'entity', 'removed': 'removed'}
++    _toPy = {'entity': 'entity', 'removed': 'removed'}
++    def __init__(self, entity=None, removed=None, **unknown_fields):
++        '''
++        entity : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        removed : bool
++        '''
++        self.entity = entity
++        self.removed = removed
++
++
++
++class DeployerConnectionValues(Type):
++    _toSchema = {'api_addresses': 'api-addresses', 'state_addresses': 'state-addresses'}
++    _toPy = {'api-addresses': 'api_addresses', 'state-addresses': 'state_addresses'}
++    def __init__(self, api_addresses=None, state_addresses=None, **unknown_fields):
++        '''
++        api_addresses : typing.Sequence<+T_co>[str]
++        state_addresses : typing.Sequence<+T_co>[str]
++        '''
++        self.api_addresses = api_addresses
++        self.state_addresses = state_addresses
++
++
++
++class DestroyApplicationInfo(Type):
++    _toSchema = {'destroyed_storage': 'destroyed-storage', 'destroyed_units': 'destroyed-units', 'detached_storage': 'detached-storage'}
++    _toPy = {'destroyed-storage': 'destroyed_storage', 'destroyed-units': 'destroyed_units', 'detached-storage': 'detached_storage'}
++    def __init__(self, destroyed_storage=None, destroyed_units=None, detached_storage=None, **unknown_fields):
++        '''
++        destroyed_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        destroyed_units : typing.Sequence<+T_co>[~Entity]<~Entity>
++        detached_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.destroyed_storage = [Entity.from_json(o) for o in destroyed_storage or []]
++        self.destroyed_units = [Entity.from_json(o) for o in destroyed_units or []]
++        self.detached_storage = [Entity.from_json(o) for o in detached_storage or []]
++
++
++
++class DestroyApplicationResult(Type):
++    _toSchema = {'error': 'error', 'info': 'info'}
++    _toPy = {'error': 'error', 'info': 'info'}
++    def __init__(self, error=None, info=None, **unknown_fields):
++        '''
++        error : Error
++        info : DestroyApplicationInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.info = DestroyApplicationInfo.from_json(info) if info else None
++
++
++
++class DestroyApplicationResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult>
++        '''
++        self.results = [DestroyApplicationResult.from_json(o) for o in results or []]
++
++
++
++class DestroyApplicationUnits(Type):
++    _toSchema = {'unit_names': 'unit-names'}
++    _toPy = {'unit-names': 'unit_names'}
++    def __init__(self, unit_names=None, **unknown_fields):
++        '''
++        unit_names : typing.Sequence<+T_co>[str]
++        '''
++        self.unit_names = unit_names
++
++
++
++class DestroyControllerArgs(Type):
++    _toSchema = {'destroy_models': 'destroy-models'}
++    _toPy = {'destroy-models': 'destroy_models'}
++    def __init__(self, destroy_models=None, **unknown_fields):
++        '''
++        destroy_models : bool
++        '''
++        self.destroy_models = destroy_models
++
++
++
++class DestroyMachineInfo(Type):
++    _toSchema = {'destroyed_storage': 'destroyed-storage', 'destroyed_units': 'destroyed-units', 'detached_storage': 'detached-storage'}
++    _toPy = {'destroyed-storage': 'destroyed_storage', 'destroyed-units': 'destroyed_units', 'detached-storage': 'detached_storage'}
++    def __init__(self, destroyed_storage=None, destroyed_units=None, detached_storage=None, **unknown_fields):
++        '''
++        destroyed_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        destroyed_units : typing.Sequence<+T_co>[~Entity]<~Entity>
++        detached_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.destroyed_storage = [Entity.from_json(o) for o in destroyed_storage or []]
++        self.destroyed_units = [Entity.from_json(o) for o in destroyed_units or []]
++        self.detached_storage = [Entity.from_json(o) for o in detached_storage or []]
++
++
++
++class DestroyMachineResult(Type):
++    _toSchema = {'error': 'error', 'info': 'info'}
++    _toPy = {'error': 'error', 'info': 'info'}
++    def __init__(self, error=None, info=None, **unknown_fields):
++        '''
++        error : Error
++        info : DestroyMachineInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.info = DestroyMachineInfo.from_json(info) if info else None
++
++
++
++class DestroyMachineResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult>
++        '''
++        self.results = [DestroyMachineResult.from_json(o) for o in results or []]
++
++
++
++class DestroyMachines(Type):
++    _toSchema = {'force': 'force', 'machine_names': 'machine-names'}
++    _toPy = {'force': 'force', 'machine-names': 'machine_names'}
++    def __init__(self, force=None, machine_names=None, **unknown_fields):
++        '''
++        force : bool
++        machine_names : typing.Sequence<+T_co>[str]
++        '''
++        self.force = force
++        self.machine_names = machine_names
++
++
++
++class DestroyRelation(Type):
++    _toSchema = {'endpoints': 'endpoints'}
++    _toPy = {'endpoints': 'endpoints'}
++    def __init__(self, endpoints=None, **unknown_fields):
++        '''
++        endpoints : typing.Sequence<+T_co>[str]
++        '''
++        self.endpoints = endpoints
++
++
++
++class DestroyUnitInfo(Type):
++    _toSchema = {'destroyed_storage': 'destroyed-storage', 'detached_storage': 'detached-storage'}
++    _toPy = {'destroyed-storage': 'destroyed_storage', 'detached-storage': 'detached_storage'}
++    def __init__(self, destroyed_storage=None, detached_storage=None, **unknown_fields):
++        '''
++        destroyed_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        detached_storage : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.destroyed_storage = [Entity.from_json(o) for o in destroyed_storage or []]
++        self.detached_storage = [Entity.from_json(o) for o in detached_storage or []]
++
++
++
++class DestroyUnitResult(Type):
++    _toSchema = {'error': 'error', 'info': 'info'}
++    _toPy = {'error': 'error', 'info': 'info'}
++    def __init__(self, error=None, info=None, **unknown_fields):
++        '''
++        error : Error
++        info : DestroyUnitInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.info = DestroyUnitInfo.from_json(info) if info else None
++
++
++
++class DestroyUnitResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult>
++        '''
++        self.results = [DestroyUnitResult.from_json(o) for o in results or []]
++
++
++
++class DetailedStatus(Type):
++    _toSchema = {'data': 'data', 'err': 'err', 'info': 'info', 'kind': 'kind', 'life': 'life', 'since': 'since', 'status': 'status', 'version': 'version'}
++    _toPy = {'data': 'data', 'err': 'err', 'info': 'info', 'kind': 'kind', 'life': 'life', 'since': 'since', 'status': 'status', 'version': 'version'}
++    def __init__(self, data=None, err=None, info=None, kind=None, life=None, since=None, status=None, version=None, **unknown_fields):
++        '''
++        data : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        err : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        info : str
++        kind : str
++        life : str
++        since : str
++        status : str
++        version : str
++        '''
++        self.data = data
++        self.err = err
++        self.info = info
++        self.kind = kind
++        self.life = life
++        self.since = since
++        self.status = status
++        self.version = version
++
++
++
++class DeviceBridgeInfo(Type):
++    _toSchema = {'bridge_name': 'bridge-name', 'host_device_name': 'host-device-name'}
++    _toPy = {'bridge-name': 'bridge_name', 'host-device-name': 'host_device_name'}
++    def __init__(self, bridge_name=None, host_device_name=None, **unknown_fields):
++        '''
++        bridge_name : str
++        host_device_name : str
++        '''
++        self.bridge_name = bridge_name
++        self.host_device_name = host_device_name
++
++
++
++class DiscoverSpacesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ProviderSpace]<~ProviderSpace>
++        '''
++        self.results = [ProviderSpace.from_json(o) for o in results or []]
++
++
++
++class DistributionGroupResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Sequence<+T_co>[str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class DistributionGroupResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~DistributionGroupResult]<~DistributionGroupResult>
++        '''
++        self.results = [DistributionGroupResult.from_json(o) for o in results or []]
++
++
++
++class DumpModelRequest(Type):
++    _toSchema = {'entities': 'entities', 'simplified': 'simplified'}
++    _toPy = {'entities': 'entities', 'simplified': 'simplified'}
++    def __init__(self, entities=None, simplified=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        simplified : bool
++        '''
++        self.entities = [Entity.from_json(o) for o in entities or []]
++        self.simplified = simplified
++
++
++
++class Endpoint(Type):
++    _toSchema = {'application_name': 'application-name', 'relation': 'relation'}
++    _toPy = {'application-name': 'application_name', 'relation': 'relation'}
++    def __init__(self, application_name=None, relation=None, **unknown_fields):
++        '''
++        application_name : str
++        relation : CharmRelation
++        '''
++        self.application_name = application_name
++        self.relation = CharmRelation.from_json(relation) if relation else None
++
++
++
++class EndpointStatus(Type):
++    _toSchema = {'application': 'application', 'name': 'name', 'role': 'role', 'subordinate': 'subordinate'}
++    _toPy = {'application': 'application', 'name': 'name', 'role': 'role', 'subordinate': 'subordinate'}
++    def __init__(self, application=None, name=None, role=None, subordinate=None, **unknown_fields):
++        '''
++        application : str
++        name : str
++        role : str
++        subordinate : bool
++        '''
++        self.application = application
++        self.name = name
++        self.role = role
++        self.subordinate = subordinate
++
++
++
++class Entities(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.entities = [Entity.from_json(o) for o in entities or []]
++
++
++
++class EntitiesCharmURL(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL>
++        '''
++        self.entities = [EntityCharmURL.from_json(o) for o in entities or []]
++
++
++
++class EntitiesPortRanges(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange>
++        '''
++        self.entities = [EntityPortRange.from_json(o) for o in entities or []]
++
++
++
++class EntitiesResult(Type):
++    _toSchema = {'entities': 'entities', 'error': 'error'}
++    _toPy = {'entities': 'entities', 'error': 'error'}
++    def __init__(self, entities=None, error=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        error : Error
++        '''
++        self.entities = [Entity.from_json(o) for o in entities or []]
++        self.error = Error.from_json(error) if error else None
++
++
++
++class EntitiesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~EntitiesResult]<~EntitiesResult>
++        '''
++        self.results = [EntitiesResult.from_json(o) for o in results or []]
++
++
++
++class EntitiesVersion(Type):
++    _toSchema = {'agent_tools': 'agent-tools'}
++    _toPy = {'agent-tools': 'agent_tools'}
++    def __init__(self, agent_tools=None, **unknown_fields):
++        '''
++        agent_tools : typing.Sequence<+T_co>[~EntityVersion]<~EntityVersion>
++        '''
++        self.agent_tools = [EntityVersion.from_json(o) for o in agent_tools or []]
++
++
++
++class EntitiesWatchResult(Type):
++    _toSchema = {'changes': 'changes', 'error': 'error', 'watcher_id': 'watcher-id'}
++    _toPy = {'changes': 'changes', 'error': 'error', 'watcher-id': 'watcher_id'}
++    def __init__(self, changes=None, error=None, watcher_id=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[str]
++        error : Error
++        watcher_id : str
++        '''
++        self.changes = changes
++        self.error = Error.from_json(error) if error else None
++        self.watcher_id = watcher_id
++
++
++
++class Entity(Type):
++    _toSchema = {'tag': 'tag'}
++    _toPy = {'tag': 'tag'}
++    def __init__(self, tag=None, **unknown_fields):
++        '''
++        tag : str
++        '''
++        self.tag = tag
++
++
++
++class EntityAnnotations(Type):
++    _toSchema = {'annotations': 'annotations', 'entity': 'entity'}
++    _toPy = {'annotations': 'annotations', 'entity': 'entity'}
++    def __init__(self, annotations=None, entity=None, **unknown_fields):
++        '''
++        annotations : typing.Mapping<~KT, +VT_co>[str, str]
++        entity : str
++        '''
++        self.annotations = annotations
++        self.entity = entity
++
++
++
++class EntityCharmURL(Type):
++    _toSchema = {'charm_url': 'charm-url', 'tag': 'tag'}
++    _toPy = {'charm-url': 'charm_url', 'tag': 'tag'}
++    def __init__(self, charm_url=None, tag=None, **unknown_fields):
++        '''
++        charm_url : str
++        tag : str
++        '''
++        self.charm_url = charm_url
++        self.tag = tag
++
++
++
++class EntityMetrics(Type):
++    _toSchema = {'error': 'error', 'metrics': 'metrics'}
++    _toPy = {'error': 'error', 'metrics': 'metrics'}
++    def __init__(self, error=None, metrics=None, **unknown_fields):
++        '''
++        error : Error
++        metrics : typing.Sequence<+T_co>[~MetricResult]<~MetricResult>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.metrics = [MetricResult.from_json(o) for o in metrics or []]
++
++
++
++class EntityPassword(Type):
++    _toSchema = {'password': 'password', 'tag': 'tag'}
++    _toPy = {'password': 'password', 'tag': 'tag'}
++    def __init__(self, password=None, tag=None, **unknown_fields):
++        '''
++        password : str
++        tag : str
++        '''
++        self.password = password
++        self.tag = tag
++
++
++
++class EntityPasswords(Type):
++    _toSchema = {'changes': 'changes'}
++    _toPy = {'changes': 'changes'}
++    def __init__(self, changes=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword>
++        '''
++        self.changes = [EntityPassword.from_json(o) for o in changes or []]
++
++
++
++class EntityPortRange(Type):
++    _toSchema = {'from_port': 'from-port', 'protocol': 'protocol', 'tag': 'tag', 'to_port': 'to-port'}
++    _toPy = {'from-port': 'from_port', 'protocol': 'protocol', 'tag': 'tag', 'to-port': 'to_port'}
++    def __init__(self, from_port=None, protocol=None, tag=None, to_port=None, **unknown_fields):
++        '''
++        from_port : int
++        protocol : str
++        tag : str
++        to_port : int
++        '''
++        self.from_port = from_port
++        self.protocol = protocol
++        self.tag = tag
++        self.to_port = to_port
++
++
++
++class EntityStatus(Type):
++    _toSchema = {'data': 'data', 'info': 'info', 'since': 'since', 'status': 'status'}
++    _toPy = {'data': 'data', 'info': 'info', 'since': 'since', 'status': 'status'}
++    def __init__(self, data=None, info=None, since=None, status=None, **unknown_fields):
++        '''
++        data : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        info : str
++        since : str
++        status : str
++        '''
++        self.data = data
++        self.info = info
++        self.since = since
++        self.status = status
++
++
++
++class EntityStatusArgs(Type):
++    _toSchema = {'data': 'data', 'info': 'info', 'status': 'status', 'tag': 'tag'}
++    _toPy = {'data': 'data', 'info': 'info', 'status': 'status', 'tag': 'tag'}
++    def __init__(self, data=None, info=None, status=None, tag=None, **unknown_fields):
++        '''
++        data : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        info : str
++        status : str
++        tag : str
++        '''
++        self.data = data
++        self.info = info
++        self.status = status
++        self.tag = tag
++
++
++
++class EntityVersion(Type):
++    _toSchema = {'tag': 'tag', 'tools': 'tools'}
++    _toPy = {'tag': 'tag', 'tools': 'tools'}
++    def __init__(self, tag=None, tools=None, **unknown_fields):
++        '''
++        tag : str
++        tools : Version
++        '''
++        self.tag = tag
++        self.tools = Version.from_json(tools) if tools else None
++
++
++
++class EntityWorkloadVersion(Type):
++    _toSchema = {'tag': 'tag', 'workload_version': 'workload-version'}
++    _toPy = {'tag': 'tag', 'workload-version': 'workload_version'}
++    def __init__(self, tag=None, workload_version=None, **unknown_fields):
++        '''
++        tag : str
++        workload_version : str
++        '''
++        self.tag = tag
++        self.workload_version = workload_version
++
++
++
++class EntityWorkloadVersions(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion>
++        '''
++        self.entities = [EntityWorkloadVersion.from_json(o) for o in entities or []]
++
++
++
++class EnvListArgs(Type):
++    _toSchema = {'patterns': 'patterns'}
++    _toPy = {'patterns': 'patterns'}
++    def __init__(self, patterns=None, **unknown_fields):
++        '''
++        patterns : typing.Sequence<+T_co>[str]
++        '''
++        self.patterns = patterns
++
++
++
++class EnvListResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~Payload]<~Payload>
++        '''
++        self.results = [Payload.from_json(o) for o in results or []]
++
++
++
++class Error(Type):
++    _toSchema = {'code': 'code', 'info': 'info', 'message': 'message'}
++    _toPy = {'code': 'code', 'info': 'info', 'message': 'message'}
++    def __init__(self, code=None, info=None, message=None, **unknown_fields):
++        '''
++        code : str
++        info : ErrorInfo
++        message : str
++        '''
++        self.code = code
++        self.info = ErrorInfo.from_json(info) if info else None
++        self.message = message
++
++
++
++class ErrorInfo(Type):
++    _toSchema = {'macaroon': 'macaroon', 'macaroon_path': 'macaroon-path'}
++    _toPy = {'macaroon': 'macaroon', 'macaroon-path': 'macaroon_path'}
++    def __init__(self, macaroon=None, macaroon_path=None, **unknown_fields):
++        '''
++        macaroon : Macaroon
++        macaroon_path : str
++        '''
++        self.macaroon = Macaroon.from_json(macaroon) if macaroon else None
++        self.macaroon_path = macaroon_path
++
++
++
++class ErrorResult(Type):
++    _toSchema = {'error': 'error'}
++    _toPy = {'error': 'error'}
++    def __init__(self, error=None, **unknown_fields):
++        '''
++        error : Error
++        '''
++        self.error = Error.from_json(error) if error else None
++
++
++
++class ErrorResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
++        '''
++        self.results = [ErrorResult.from_json(o) for o in results or []]
++
++
++
++class Filesystem(Type):
++    _toSchema = {'filesystem_tag': 'filesystem-tag', 'info': 'info', 'volume_tag': 'volume-tag'}
++    _toPy = {'filesystem-tag': 'filesystem_tag', 'info': 'info', 'volume-tag': 'volume_tag'}
++    def __init__(self, filesystem_tag=None, info=None, volume_tag=None, **unknown_fields):
++        '''
++        filesystem_tag : str
++        info : FilesystemInfo
++        volume_tag : str
++        '''
++        self.filesystem_tag = filesystem_tag
++        self.info = FilesystemInfo.from_json(info) if info else None
++        self.volume_tag = volume_tag
++
++
++
++class FilesystemAttachment(Type):
++    _toSchema = {'filesystem_tag': 'filesystem-tag', 'info': 'info', 'machine_tag': 'machine-tag'}
++    _toPy = {'filesystem-tag': 'filesystem_tag', 'info': 'info', 'machine-tag': 'machine_tag'}
++    def __init__(self, filesystem_tag=None, info=None, machine_tag=None, **unknown_fields):
++        '''
++        filesystem_tag : str
++        info : FilesystemAttachmentInfo
++        machine_tag : str
++        '''
++        self.filesystem_tag = filesystem_tag
++        self.info = FilesystemAttachmentInfo.from_json(info) if info else None
++        self.machine_tag = machine_tag
++
++
++
++class FilesystemAttachmentDetails(Type):
++    _toSchema = {'filesystemattachmentinfo': 'FilesystemAttachmentInfo', 'life': 'life'}
++    _toPy = {'FilesystemAttachmentInfo': 'filesystemattachmentinfo', 'life': 'life'}
++    def __init__(self, filesystemattachmentinfo=None, life=None, **unknown_fields):
++        '''
++        filesystemattachmentinfo : FilesystemAttachmentInfo
++        life : str
++        '''
++        self.filesystemattachmentinfo = FilesystemAttachmentInfo.from_json(filesystemattachmentinfo) if filesystemattachmentinfo else None
++        self.life = life
++
++
++
++class FilesystemAttachmentInfo(Type):
++    _toSchema = {'mount_point': 'mount-point', 'read_only': 'read-only'}
++    _toPy = {'mount-point': 'mount_point', 'read-only': 'read_only'}
++    def __init__(self, mount_point=None, read_only=None, **unknown_fields):
++        '''
++        mount_point : str
++        read_only : bool
++        '''
++        self.mount_point = mount_point
++        self.read_only = read_only
++
++
++
++class FilesystemAttachmentParams(Type):
++    _toSchema = {'filesystem_id': 'filesystem-id', 'filesystem_tag': 'filesystem-tag', 'instance_id': 'instance-id', 'machine_tag': 'machine-tag', 'mount_point': 'mount-point', 'provider': 'provider', 'read_only': 'read-only'}
++    _toPy = {'filesystem-id': 'filesystem_id', 'filesystem-tag': 'filesystem_tag', 'instance-id': 'instance_id', 'machine-tag': 'machine_tag', 'mount-point': 'mount_point', 'provider': 'provider', 'read-only': 'read_only'}
++    def __init__(self, filesystem_id=None, filesystem_tag=None, instance_id=None, machine_tag=None, mount_point=None, provider=None, read_only=None, **unknown_fields):
++        '''
++        filesystem_id : str
++        filesystem_tag : str
++        instance_id : str
++        machine_tag : str
++        mount_point : str
++        provider : str
++        read_only : bool
++        '''
++        self.filesystem_id = filesystem_id
++        self.filesystem_tag = filesystem_tag
++        self.instance_id = instance_id
++        self.machine_tag = machine_tag
++        self.mount_point = mount_point
++        self.provider = provider
++        self.read_only = read_only
++
++
++
++class FilesystemAttachmentParamsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : FilesystemAttachmentParams
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = FilesystemAttachmentParams.from_json(result) if result else None
++
++
++
++class FilesystemAttachmentParamsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~FilesystemAttachmentParamsResult]<~FilesystemAttachmentParamsResult>
++        '''
++        self.results = [FilesystemAttachmentParamsResult.from_json(o) for o in results or []]
++
++
++
++class FilesystemAttachmentResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : FilesystemAttachment
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = FilesystemAttachment.from_json(result) if result else None
++
++
++
++class FilesystemAttachmentResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~FilesystemAttachmentResult]<~FilesystemAttachmentResult>
++        '''
++        self.results = [FilesystemAttachmentResult.from_json(o) for o in results or []]
++
++
++
++class FilesystemAttachments(Type):
++    _toSchema = {'filesystem_attachments': 'filesystem-attachments'}
++    _toPy = {'filesystem-attachments': 'filesystem_attachments'}
++    def __init__(self, filesystem_attachments=None, **unknown_fields):
++        '''
++        filesystem_attachments : typing.Sequence<+T_co>[~FilesystemAttachment]<~FilesystemAttachment>
++        '''
++        self.filesystem_attachments = [FilesystemAttachment.from_json(o) for o in filesystem_attachments or []]
++
++
++
++class FilesystemDetails(Type):
++    _toSchema = {'filesystem_tag': 'filesystem-tag', 'info': 'info', 'machine_attachments': 'machine-attachments', 'status': 'status', 'storage': 'storage', 'volume_tag': 'volume-tag'}
++    _toPy = {'filesystem-tag': 'filesystem_tag', 'info': 'info', 'machine-attachments': 'machine_attachments', 'status': 'status', 'storage': 'storage', 'volume-tag': 'volume_tag'}
++    def __init__(self, filesystem_tag=None, info=None, machine_attachments=None, status=None, storage=None, volume_tag=None, **unknown_fields):
++        '''
++        filesystem_tag : str
++        info : FilesystemInfo
++        machine_attachments : typing.Mapping<~KT, +VT_co>[str, ~FilesystemAttachmentInfo]<~FilesystemAttachmentInfo>
++        status : EntityStatus
++        storage : StorageDetails
++        volume_tag : str
++        '''
++        self.filesystem_tag = filesystem_tag
++        self.info = FilesystemInfo.from_json(info) if info else None
++        self.machine_attachments = machine_attachments
++        self.status = EntityStatus.from_json(status) if status else None
++        self.storage = StorageDetails.from_json(storage) if storage else None
++        self.volume_tag = volume_tag
++
++
++
++class FilesystemDetailsListResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Sequence<+T_co>[~FilesystemDetails]<~FilesystemDetails>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = [FilesystemDetails.from_json(o) for o in result or []]
++
++
++
++class FilesystemDetailsListResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~FilesystemDetailsListResult]<~FilesystemDetailsListResult>
++        '''
++        self.results = [FilesystemDetailsListResult.from_json(o) for o in results or []]
++
++
++
++class FilesystemFilter(Type):
++    _toSchema = {'machines': 'machines'}
++    _toPy = {'machines': 'machines'}
++    def __init__(self, machines=None, **unknown_fields):
++        '''
++        machines : typing.Sequence<+T_co>[str]
++        '''
++        self.machines = machines
++
++
++
++class FilesystemFilters(Type):
++    _toSchema = {'filters': 'filters'}
++    _toPy = {'filters': 'filters'}
++    def __init__(self, filters=None, **unknown_fields):
++        '''
++        filters : typing.Sequence<+T_co>[~FilesystemFilter]<~FilesystemFilter>
++        '''
++        self.filters = [FilesystemFilter.from_json(o) for o in filters or []]
++
++
++
++class FilesystemInfo(Type):
++    _toSchema = {'filesystem_id': 'filesystem-id', 'size': 'size'}
++    _toPy = {'filesystem-id': 'filesystem_id', 'size': 'size'}
++    def __init__(self, filesystem_id=None, size=None, **unknown_fields):
++        '''
++        filesystem_id : str
++        size : int
++        '''
++        self.filesystem_id = filesystem_id
++        self.size = size
++
++
++
++class FilesystemParams(Type):
++    _toSchema = {'attachment': 'attachment', 'attributes': 'attributes', 'filesystem_tag': 'filesystem-tag', 'provider': 'provider', 'size': 'size', 'tags': 'tags', 'volume_tag': 'volume-tag'}
++    _toPy = {'attachment': 'attachment', 'attributes': 'attributes', 'filesystem-tag': 'filesystem_tag', 'provider': 'provider', 'size': 'size', 'tags': 'tags', 'volume-tag': 'volume_tag'}
++    def __init__(self, attachment=None, attributes=None, filesystem_tag=None, provider=None, size=None, tags=None, volume_tag=None, **unknown_fields):
++        '''
++        attachment : FilesystemAttachmentParams
++        attributes : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        filesystem_tag : str
++        provider : str
++        size : int
++        tags : typing.Mapping<~KT, +VT_co>[str, str]
++        volume_tag : str
++        '''
++        self.attachment = FilesystemAttachmentParams.from_json(attachment) if attachment else None
++        self.attributes = attributes
++        self.filesystem_tag = filesystem_tag
++        self.provider = provider
++        self.size = size
++        self.tags = tags
++        self.volume_tag = volume_tag
++
++
++
++class FilesystemParamsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : FilesystemParams
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = FilesystemParams.from_json(result) if result else None
++
++
++
++class FilesystemParamsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~FilesystemParamsResult]<~FilesystemParamsResult>
++        '''
++        self.results = [FilesystemParamsResult.from_json(o) for o in results or []]
++
++
++
++class FilesystemResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : Filesystem
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = Filesystem.from_json(result) if result else None
++
++
++
++class FilesystemResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~FilesystemResult]<~FilesystemResult>
++        '''
++        self.results = [FilesystemResult.from_json(o) for o in results or []]
++
++
++
++class Filesystems(Type):
++    _toSchema = {'filesystems': 'filesystems'}
++    _toPy = {'filesystems': 'filesystems'}
++    def __init__(self, filesystems=None, **unknown_fields):
++        '''
++        filesystems : typing.Sequence<+T_co>[~Filesystem]<~Filesystem>
++        '''
++        self.filesystems = [Filesystem.from_json(o) for o in filesystems or []]
++
++
++
++class FindActionsByNames(Type):
++    _toSchema = {'names': 'names'}
++    _toPy = {'names': 'names'}
++    def __init__(self, names=None, **unknown_fields):
++        '''
++        names : typing.Sequence<+T_co>[str]
++        '''
++        self.names = names
++
++
++
++class FindTags(Type):
++    _toSchema = {'prefixes': 'prefixes'}
++    _toPy = {'prefixes': 'prefixes'}
++    def __init__(self, prefixes=None, **unknown_fields):
++        '''
++        prefixes : typing.Sequence<+T_co>[str]
++        '''
++        self.prefixes = prefixes
++
++
++
++class FindTagsResults(Type):
++    _toSchema = {'matches': 'matches'}
++    _toPy = {'matches': 'matches'}
++    def __init__(self, matches=None, **unknown_fields):
++        '''
++        matches : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.matches = [Entity.from_json(o) for o in matches or []]
++
++
++
++class FindToolsParams(Type):
++    _toSchema = {'arch': 'arch', 'major': 'major', 'minor': 'minor', 'number': 'number', 'series': 'series'}
++    _toPy = {'arch': 'arch', 'major': 'major', 'minor': 'minor', 'number': 'number', 'series': 'series'}
++    def __init__(self, arch=None, major=None, minor=None, number=None, series=None, **unknown_fields):
++        '''
++        arch : str
++        major : int
++        minor : int
++        number : Number
++        series : str
++        '''
++        self.arch = arch
++        self.major = major
++        self.minor = minor
++        self.number = Number.from_json(number) if number else None
++        self.series = series
++
++
++
++class FindToolsResult(Type):
++    _toSchema = {'error': 'error', 'list_': 'list'}
++    _toPy = {'error': 'error', 'list': 'list_'}
++    def __init__(self, error=None, list_=None, **unknown_fields):
++        '''
++        error : Error
++        list_ : typing.Sequence<+T_co>[~Tools]<~Tools>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.list_ = [Tools.from_json(o) for o in list_ or []]
++
++
++
++class FullStatus(Type):
++    _toSchema = {'applications': 'applications', 'machines': 'machines', 'model': 'model', 'relations': 'relations', 'remote_applications': 'remote-applications'}
++    _toPy = {'applications': 'applications', 'machines': 'machines', 'model': 'model', 'relations': 'relations', 'remote-applications': 'remote_applications'}
++    def __init__(self, applications=None, machines=None, model=None, relations=None, remote_applications=None, **unknown_fields):
++        '''
++        applications : typing.Mapping<~KT, +VT_co>[str, ~ApplicationStatus]<~ApplicationStatus>
++        machines : typing.Mapping<~KT, +VT_co>[str, ~MachineStatus]<~MachineStatus>
++        model : ModelStatusInfo
++        relations : typing.Sequence<+T_co>[~RelationStatus]<~RelationStatus>
++        remote_applications : typing.Mapping<~KT, +VT_co>[str, ~RemoteApplicationStatus]<~RemoteApplicationStatus>
++        '''
++        self.applications = applications
++        self.machines = machines
++        self.model = ModelStatusInfo.from_json(model) if model else None
++        self.relations = [RelationStatus.from_json(o) for o in relations or []]
++        self.remote_applications = remote_applications
++
++
++
++class GetApplicationConstraints(Type):
++    _toSchema = {'application': 'application'}
++    _toPy = {'application': 'application'}
++    def __init__(self, application=None, **unknown_fields):
++        '''
++        application : str
++        '''
++        self.application = application
++
++
++
++class GetConstraintsResults(Type):
++    _toSchema = {'constraints': 'constraints'}
++    _toPy = {'constraints': 'constraints'}
++    def __init__(self, constraints=None, **unknown_fields):
++        '''
++        constraints : Value
++        '''
++        self.constraints = Value.from_json(constraints) if constraints else None
++
++
++
++class GetLeadershipSettingsBulkResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult>
++        '''
++        self.results = [GetLeadershipSettingsResult.from_json(o) for o in results or []]
++
++
++
++class GetLeadershipSettingsResult(Type):
++    _toSchema = {'error': 'error', 'settings': 'settings'}
++    _toPy = {'error': 'error', 'settings': 'settings'}
++    def __init__(self, error=None, settings=None, **unknown_fields):
++        '''
++        error : Error
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.settings = settings
++
++
++
++class HAMember(Type):
++    _toSchema = {'public_address': 'public-address', 'series': 'series', 'tag': 'tag'}
++    _toPy = {'public-address': 'public_address', 'series': 'series', 'tag': 'tag'}
++    def __init__(self, public_address=None, series=None, tag=None, **unknown_fields):
++        '''
++        public_address : Address
++        series : str
++        tag : str
++        '''
++        self.public_address = Address.from_json(public_address) if public_address else None
++        self.series = series
++        self.tag = tag
++
++
++
++class HardwareCharacteristics(Type):
++    _toSchema = {'arch': 'arch', 'availability_zone': 'availability-zone', 'cpu_cores': 'cpu-cores', 'cpu_power': 'cpu-power', 'mem': 'mem', 'root_disk': 'root-disk', 'tags': 'tags'}
++    _toPy = {'arch': 'arch', 'availability-zone': 'availability_zone', 'cpu-cores': 'cpu_cores', 'cpu-power': 'cpu_power', 'mem': 'mem', 'root-disk': 'root_disk', 'tags': 'tags'}
++    def __init__(self, arch=None, availability_zone=None, cpu_cores=None, cpu_power=None, mem=None, root_disk=None, tags=None, **unknown_fields):
++        '''
++        arch : str
++        availability_zone : str
++        cpu_cores : int
++        cpu_power : int
++        mem : int
++        root_disk : int
++        tags : typing.Sequence<+T_co>[str]
++        '''
++        self.arch = arch
++        self.availability_zone = availability_zone
++        self.cpu_cores = cpu_cores
++        self.cpu_power = cpu_power
++        self.mem = mem
++        self.root_disk = root_disk
++        self.tags = tags
++
++
++
++class History(Type):
++    _toSchema = {'error': 'error', 'statuses': 'statuses'}
++    _toPy = {'error': 'error', 'statuses': 'statuses'}
++    def __init__(self, error=None, statuses=None, **unknown_fields):
++        '''
++        error : Error
++        statuses : typing.Sequence<+T_co>[~DetailedStatus]<~DetailedStatus>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.statuses = [DetailedStatus.from_json(o) for o in statuses or []]
++
++
++
++class HostNetworkChange(Type):
++    _toSchema = {'error': 'error', 'new_bridges': 'new-bridges', 'reconfigure_delay': 'reconfigure-delay'}
++    _toPy = {'error': 'error', 'new-bridges': 'new_bridges', 'reconfigure-delay': 'reconfigure_delay'}
++    def __init__(self, error=None, new_bridges=None, reconfigure_delay=None, **unknown_fields):
++        '''
++        error : Error
++        new_bridges : typing.Sequence<+T_co>[~DeviceBridgeInfo]<~DeviceBridgeInfo>
++        reconfigure_delay : int
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.new_bridges = [DeviceBridgeInfo.from_json(o) for o in new_bridges or []]
++        self.reconfigure_delay = reconfigure_delay
++
++
++
++class HostNetworkChangeResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~HostNetworkChange]<~HostNetworkChange>
++        '''
++        self.results = [HostNetworkChange.from_json(o) for o in results or []]
++
++
++
++class HostPort(Type):
++    _toSchema = {'address': 'Address', 'port': 'port'}
++    _toPy = {'Address': 'address', 'port': 'port'}
++    def __init__(self, address=None, port=None, **unknown_fields):
++        '''
++        address : Address
++        port : int
++        '''
++        self.address = Address.from_json(address) if address else None
++        self.port = port
++
++
++
++class HostedModelConfig(Type):
++    _toSchema = {'cloud_spec': 'cloud-spec', 'config': 'config', 'error': 'error', 'name': 'name', 'owner': 'owner'}
++    _toPy = {'cloud-spec': 'cloud_spec', 'config': 'config', 'error': 'error', 'name': 'name', 'owner': 'owner'}
++    def __init__(self, cloud_spec=None, config=None, error=None, name=None, owner=None, **unknown_fields):
++        '''
++        cloud_spec : CloudSpec
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        error : Error
++        name : str
++        owner : str
++        '''
++        self.cloud_spec = CloudSpec.from_json(cloud_spec) if cloud_spec else None
++        self.config = config
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++        self.owner = owner
++
++
++
++class HostedModelConfigsResults(Type):
++    _toSchema = {'models': 'models'}
++    _toPy = {'models': 'models'}
++    def __init__(self, models=None, **unknown_fields):
++        '''
++        models : typing.Sequence<+T_co>[~HostedModelConfig]<~HostedModelConfig>
++        '''
++        self.models = [HostedModelConfig.from_json(o) for o in models or []]
++
++
++
++class ImageFilterParams(Type):
++    _toSchema = {'images': 'images'}
++    _toPy = {'images': 'images'}
++    def __init__(self, images=None, **unknown_fields):
++        '''
++        images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec>
++        '''
++        self.images = [ImageSpec.from_json(o) for o in images or []]
++
++
++
++class ImageMetadata(Type):
++    _toSchema = {'arch': 'arch', 'created': 'created', 'kind': 'kind', 'series': 'series', 'url': 'url'}
++    _toPy = {'arch': 'arch', 'created': 'created', 'kind': 'kind', 'series': 'series', 'url': 'url'}
++    def __init__(self, arch=None, created=None, kind=None, series=None, url=None, **unknown_fields):
++        '''
++        arch : str
++        created : str
++        kind : str
++        series : str
++        url : str
++        '''
++        self.arch = arch
++        self.created = created
++        self.kind = kind
++        self.series = series
++        self.url = url
++
++
++
++class ImageMetadataFilter(Type):
++    _toSchema = {'arches': 'arches', 'region': 'region', 'root_storage_type': 'root-storage-type', 'series': 'series', 'stream': 'stream', 'virt_type': 'virt-type'}
++    _toPy = {'arches': 'arches', 'region': 'region', 'root-storage-type': 'root_storage_type', 'series': 'series', 'stream': 'stream', 'virt-type': 'virt_type'}
++    def __init__(self, arches=None, region=None, root_storage_type=None, series=None, stream=None, virt_type=None, **unknown_fields):
++        '''
++        arches : typing.Sequence<+T_co>[str]
++        region : str
++        root_storage_type : str
++        series : typing.Sequence<+T_co>[str]
++        stream : str
++        virt_type : str
++        '''
++        self.arches = arches
++        self.region = region
++        self.root_storage_type = root_storage_type
++        self.series = series
++        self.stream = stream
++        self.virt_type = virt_type
++
++
++
++class ImageSpec(Type):
++    _toSchema = {'arch': 'arch', 'kind': 'kind', 'series': 'series'}
++    _toPy = {'arch': 'arch', 'kind': 'kind', 'series': 'series'}
++    def __init__(self, arch=None, kind=None, series=None, **unknown_fields):
++        '''
++        arch : str
++        kind : str
++        series : str
++        '''
++        self.arch = arch
++        self.kind = kind
++        self.series = series
++
++
++
++class InitiateMigrationArgs(Type):
++    _toSchema = {'specs': 'specs'}
++    _toPy = {'specs': 'specs'}
++    def __init__(self, specs=None, **unknown_fields):
++        '''
++        specs : typing.Sequence<+T_co>[~MigrationSpec]<~MigrationSpec>
++        '''
++        self.specs = [MigrationSpec.from_json(o) for o in specs or []]
++
++
++
++class InitiateMigrationResult(Type):
++    _toSchema = {'error': 'error', 'migration_id': 'migration-id', 'model_tag': 'model-tag'}
++    _toPy = {'error': 'error', 'migration-id': 'migration_id', 'model-tag': 'model_tag'}
++    def __init__(self, error=None, migration_id=None, model_tag=None, **unknown_fields):
++        '''
++        error : Error
++        migration_id : str
++        model_tag : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.migration_id = migration_id
++        self.model_tag = model_tag
++
++
++
++class InitiateMigrationResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~InitiateMigrationResult]<~InitiateMigrationResult>
++        '''
++        self.results = [InitiateMigrationResult.from_json(o) for o in results or []]
++
++
++
++class InstanceInfo(Type):
++    _toSchema = {'characteristics': 'characteristics', 'instance_id': 'instance-id', 'network_config': 'network-config', 'nonce': 'nonce', 'tag': 'tag', 'volume_attachments': 'volume-attachments', 'volumes': 'volumes'}
++    _toPy = {'characteristics': 'characteristics', 'instance-id': 'instance_id', 'network-config': 'network_config', 'nonce': 'nonce', 'tag': 'tag', 'volume-attachments': 'volume_attachments', 'volumes': 'volumes'}
++    def __init__(self, characteristics=None, instance_id=None, network_config=None, nonce=None, tag=None, volume_attachments=None, volumes=None, **unknown_fields):
++        '''
++        characteristics : HardwareCharacteristics
++        instance_id : str
++        network_config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        nonce : str
++        tag : str
++        volume_attachments : typing.Mapping<~KT, +VT_co>[str, ~VolumeAttachmentInfo]<~VolumeAttachmentInfo>
++        volumes : typing.Sequence<+T_co>[~Volume]<~Volume>
++        '''
++        self.characteristics = HardwareCharacteristics.from_json(characteristics) if characteristics else None
++        self.instance_id = instance_id
++        self.network_config = [NetworkConfig.from_json(o) for o in network_config or []]
++        self.nonce = nonce
++        self.tag = tag
++        self.volume_attachments = volume_attachments
++        self.volumes = [Volume.from_json(o) for o in volumes or []]
++
++
++
++class InstanceType(Type):
++    _toSchema = {'arches': 'arches', 'cost': 'cost', 'cpu_cores': 'cpu-cores', 'deprecated': 'deprecated', 'memory': 'memory', 'name': 'name', 'root_disk': 'root-disk', 'virt_type': 'virt-type'}
++    _toPy = {'arches': 'arches', 'cost': 'cost', 'cpu-cores': 'cpu_cores', 'deprecated': 'deprecated', 'memory': 'memory', 'name': 'name', 'root-disk': 'root_disk', 'virt-type': 'virt_type'}
++    def __init__(self, arches=None, cost=None, cpu_cores=None, deprecated=None, memory=None, name=None, root_disk=None, virt_type=None, **unknown_fields):
++        '''
++        arches : typing.Sequence<+T_co>[str]
++        cost : int
++        cpu_cores : int
++        deprecated : bool
++        memory : int
++        name : str
++        root_disk : int
++        virt_type : str
++        '''
++        self.arches = arches
++        self.cost = cost
++        self.cpu_cores = cpu_cores
++        self.deprecated = deprecated
++        self.memory = memory
++        self.name = name
++        self.root_disk = root_disk
++        self.virt_type = virt_type
++
++
++
++class InstanceTypesResult(Type):
++    _toSchema = {'cost_currency': 'cost-currency', 'cost_divisor': 'cost-divisor', 'cost_unit': 'cost-unit', 'error': 'error', 'instance_types': 'instance-types'}
++    _toPy = {'cost-currency': 'cost_currency', 'cost-divisor': 'cost_divisor', 'cost-unit': 'cost_unit', 'error': 'error', 'instance-types': 'instance_types'}
++    def __init__(self, cost_currency=None, cost_divisor=None, cost_unit=None, error=None, instance_types=None, **unknown_fields):
++        '''
++        cost_currency : str
++        cost_divisor : int
++        cost_unit : str
++        error : Error
++        instance_types : typing.Sequence<+T_co>[~InstanceType]<~InstanceType>
++        '''
++        self.cost_currency = cost_currency
++        self.cost_divisor = cost_divisor
++        self.cost_unit = cost_unit
++        self.error = Error.from_json(error) if error else None
++        self.instance_types = [InstanceType.from_json(o) for o in instance_types or []]
++
++
++
++class InstanceTypesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult>
++        '''
++        self.results = [InstanceTypesResult.from_json(o) for o in results or []]
++
++
++
++class InstancesInfo(Type):
++    _toSchema = {'machines': 'machines'}
++    _toPy = {'machines': 'machines'}
++    def __init__(self, machines=None, **unknown_fields):
++        '''
++        machines : typing.Sequence<+T_co>[~InstanceInfo]<~InstanceInfo>
++        '''
++        self.machines = [InstanceInfo.from_json(o) for o in machines or []]
++
++
++
++class IntResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : int
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class IntResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~IntResult]<~IntResult>
++        '''
++        self.results = [IntResult.from_json(o) for o in results or []]
++
++
++
++class InterfaceAddress(Type):
++    _toSchema = {'cidr': 'cidr', 'value': 'value'}
++    _toPy = {'cidr': 'cidr', 'value': 'value'}
++    def __init__(self, cidr=None, value=None, **unknown_fields):
++        '''
++        cidr : str
++        value : str
++        '''
++        self.cidr = cidr
++        self.value = value
++
++
++
++class IsMasterResult(Type):
++    _toSchema = {'master': 'master'}
++    _toPy = {'master': 'master'}
++    def __init__(self, master=None, **unknown_fields):
++        '''
++        master : bool
++        '''
++        self.master = master
++
++
++
++class IsMeteredResult(Type):
++    _toSchema = {'metered': 'metered'}
++    _toPy = {'metered': 'metered'}
++    def __init__(self, metered=None, **unknown_fields):
++        '''
++        metered : bool
++        '''
++        self.metered = metered
++
++
++
++class JobsResult(Type):
++    _toSchema = {'error': 'error', 'jobs': 'jobs'}
++    _toPy = {'error': 'error', 'jobs': 'jobs'}
++    def __init__(self, error=None, jobs=None, **unknown_fields):
++        '''
++        error : Error
++        jobs : typing.Sequence<+T_co>[str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.jobs = jobs
++
++
++
++class JobsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~JobsResult]<~JobsResult>
++        '''
++        self.results = [JobsResult.from_json(o) for o in results or []]
++
++
++
++class LifeResult(Type):
++    _toSchema = {'error': 'error', 'life': 'life'}
++    _toPy = {'error': 'error', 'life': 'life'}
++    def __init__(self, error=None, life=None, **unknown_fields):
++        '''
++        error : Error
++        life : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.life = life
++
++
++
++class LifeResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
++        '''
++        self.results = [LifeResult.from_json(o) for o in results or []]
++
++
++
++class ListCloudImageMetadataResult(Type):
++    _toSchema = {'result': 'result'}
++    _toPy = {'result': 'result'}
++    def __init__(self, result=None, **unknown_fields):
++        '''
++        result : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata>
++        '''
++        self.result = [CloudImageMetadata.from_json(o) for o in result or []]
++
++
++
++class ListImageResult(Type):
++    _toSchema = {'result': 'result'}
++    _toPy = {'result': 'result'}
++    def __init__(self, result=None, **unknown_fields):
++        '''
++        result : typing.Sequence<+T_co>[~ImageMetadata]<~ImageMetadata>
++        '''
++        self.result = [ImageMetadata.from_json(o) for o in result or []]
++
++
++
++class ListResourcesArgs(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        '''
++        self.entities = [Entity.from_json(o) for o in entities or []]
++
++
++
++class ListSSHKeys(Type):
++    _toSchema = {'entities': 'entities', 'mode': 'mode'}
++    _toPy = {'entities': 'entities', 'mode': 'mode'}
++    def __init__(self, entities=None, mode=None, **unknown_fields):
++        '''
++        entities : Entities
++        mode : bool
++        '''
++        self.entities = Entities.from_json(entities) if entities else None
++        self.mode = mode
++
++
++
++class ListSpacesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~Space]<~Space>
++        '''
++        self.results = [Space.from_json(o) for o in results or []]
++
++
++
++class ListSubnetsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        self.results = [Subnet.from_json(o) for o in results or []]
++
++
++
++class ListUnitResourcesArgs(Type):
++    _toSchema = {'resource_names': 'resource-names'}
++    _toPy = {'resource-names': 'resource_names'}
++    def __init__(self, resource_names=None, **unknown_fields):
++        '''
++        resource_names : typing.Sequence<+T_co>[str]
++        '''
++        self.resource_names = resource_names
++
++
++
++class LogForwardingGetLastSentParams(Type):
++    _toSchema = {'ids': 'ids'}
++    _toPy = {'ids': 'ids'}
++    def __init__(self, ids=None, **unknown_fields):
++        '''
++        ids : typing.Sequence<+T_co>[~LogForwardingID]<~LogForwardingID>
++        '''
++        self.ids = [LogForwardingID.from_json(o) for o in ids or []]
++
++
++
++class LogForwardingGetLastSentResult(Type):
++    _toSchema = {'err': 'err', 'record_id': 'record-id', 'record_timestamp': 'record-timestamp'}
++    _toPy = {'err': 'err', 'record-id': 'record_id', 'record-timestamp': 'record_timestamp'}
++    def __init__(self, err=None, record_id=None, record_timestamp=None, **unknown_fields):
++        '''
++        err : Error
++        record_id : int
++        record_timestamp : int
++        '''
++        self.err = Error.from_json(err) if err else None
++        self.record_id = record_id
++        self.record_timestamp = record_timestamp
++
++
++
++class LogForwardingGetLastSentResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~LogForwardingGetLastSentResult]<~LogForwardingGetLastSentResult>
++        '''
++        self.results = [LogForwardingGetLastSentResult.from_json(o) for o in results or []]
++
++
++
++class LogForwardingID(Type):
++    _toSchema = {'model': 'model', 'sink': 'sink'}
++    _toPy = {'model': 'model', 'sink': 'sink'}
++    def __init__(self, model=None, sink=None, **unknown_fields):
++        '''
++        model : str
++        sink : str
++        '''
++        self.model = model
++        self.sink = sink
++
++
++
++class LogForwardingSetLastSentParam(Type):
++    _toSchema = {'logforwardingid': 'LogForwardingID', 'record_id': 'record-id', 'record_timestamp': 'record-timestamp'}
++    _toPy = {'LogForwardingID': 'logforwardingid', 'record-id': 'record_id', 'record-timestamp': 'record_timestamp'}
++    def __init__(self, logforwardingid=None, record_id=None, record_timestamp=None, **unknown_fields):
++        '''
++        logforwardingid : LogForwardingID
++        record_id : int
++        record_timestamp : int
++        '''
++        self.logforwardingid = LogForwardingID.from_json(logforwardingid) if logforwardingid else None
++        self.record_id = record_id
++        self.record_timestamp = record_timestamp
++
++
++
++class LogForwardingSetLastSentParams(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~LogForwardingSetLastSentParam]<~LogForwardingSetLastSentParam>
++        '''
++        self.params = [LogForwardingSetLastSentParam.from_json(o) for o in params or []]
++
++
++
++class LookUpArg(Type):
++    _toSchema = {'id_': 'id', 'name': 'name'}
++    _toPy = {'id': 'id_', 'name': 'name'}
++    def __init__(self, id_=None, name=None, **unknown_fields):
++        '''
++        id_ : str
++        name : str
++        '''
++        self.id_ = id_
++        self.name = name
++
++
++
++class LookUpArgs(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~LookUpArg]<~LookUpArg>
++        '''
++        self.args = [LookUpArg.from_json(o) for o in args or []]
++
++
++
++class LookUpPayloadArg(Type):
++    _toSchema = {'id_': 'id', 'name': 'name'}
++    _toPy = {'id': 'id_', 'name': 'name'}
++    def __init__(self, id_=None, name=None, **unknown_fields):
++        '''
++        id_ : str
++        name : str
++        '''
++        self.id_ = id_
++        self.name = name
++
++
++
++class LookUpPayloadArgs(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~LookUpPayloadArg]<~LookUpPayloadArg>
++        '''
++        self.args = [LookUpPayloadArg.from_json(o) for o in args or []]
++
++
++
++class Macaroon(Type):
++    _toSchema = {}
++    _toPy = {}
++    def __init__(self, **unknown_fields):
++        '''
++
++        '''
++        pass
++
++
++
++class MachineAddresses(Type):
++    _toSchema = {'addresses': 'addresses', 'tag': 'tag'}
++    _toPy = {'addresses': 'addresses', 'tag': 'tag'}
++    def __init__(self, addresses=None, tag=None, **unknown_fields):
++        '''
++        addresses : typing.Sequence<+T_co>[~Address]<~Address>
++        tag : str
++        '''
++        self.addresses = [Address.from_json(o) for o in addresses or []]
++        self.tag = tag
++
++
++
++class MachineAddressesResult(Type):
++    _toSchema = {'addresses': 'addresses', 'error': 'error'}
++    _toPy = {'addresses': 'addresses', 'error': 'error'}
++    def __init__(self, addresses=None, error=None, **unknown_fields):
++        '''
++        addresses : typing.Sequence<+T_co>[~Address]<~Address>
++        error : Error
++        '''
++        self.addresses = [Address.from_json(o) for o in addresses or []]
++        self.error = Error.from_json(error) if error else None
++
++
++
++class MachineAddressesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MachineAddressesResult]<~MachineAddressesResult>
++        '''
++        self.results = [MachineAddressesResult.from_json(o) for o in results or []]
++
++
++
++class MachineBlockDevices(Type):
++    _toSchema = {'block_devices': 'block-devices', 'machine': 'machine'}
++    _toPy = {'block-devices': 'block_devices', 'machine': 'machine'}
++    def __init__(self, block_devices=None, machine=None, **unknown_fields):
++        '''
++        block_devices : typing.Sequence<+T_co>[~BlockDevice]<~BlockDevice>
++        machine : str
++        '''
++        self.block_devices = [BlockDevice.from_json(o) for o in block_devices or []]
++        self.machine = machine
++
++
++
++class MachineContainers(Type):
++    _toSchema = {'container_types': 'container-types', 'machine_tag': 'machine-tag'}
++    _toPy = {'container-types': 'container_types', 'machine-tag': 'machine_tag'}
++    def __init__(self, container_types=None, machine_tag=None, **unknown_fields):
++        '''
++        container_types : typing.Sequence<+T_co>[str]
++        machine_tag : str
++        '''
++        self.container_types = container_types
++        self.machine_tag = machine_tag
++
++
++
++class MachineContainersParams(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~MachineContainers]<~MachineContainers>
++        '''
++        self.params = [MachineContainers.from_json(o) for o in params or []]
++
++
++
++class MachineHardware(Type):
++    _toSchema = {'arch': 'arch', 'availability_zone': 'availability-zone', 'cores': 'cores', 'cpu_power': 'cpu-power', 'mem': 'mem', 'root_disk': 'root-disk', 'tags': 'tags'}
++    _toPy = {'arch': 'arch', 'availability-zone': 'availability_zone', 'cores': 'cores', 'cpu-power': 'cpu_power', 'mem': 'mem', 'root-disk': 'root_disk', 'tags': 'tags'}
++    def __init__(self, arch=None, availability_zone=None, cores=None, cpu_power=None, mem=None, root_disk=None, tags=None, **unknown_fields):
++        '''
++        arch : str
++        availability_zone : str
++        cores : int
++        cpu_power : int
++        mem : int
++        root_disk : int
++        tags : typing.Sequence<+T_co>[str]
++        '''
++        self.arch = arch
++        self.availability_zone = availability_zone
++        self.cores = cores
++        self.cpu_power = cpu_power
++        self.mem = mem
++        self.root_disk = root_disk
++        self.tags = tags
++
++
++
++class MachineNetworkConfigResult(Type):
++    _toSchema = {'error': 'error', 'info': 'info'}
++    _toPy = {'error': 'error', 'info': 'info'}
++    def __init__(self, error=None, info=None, **unknown_fields):
++        '''
++        error : Error
++        info : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.info = [NetworkConfig.from_json(o) for o in info or []]
++
++
++
++class MachineNetworkConfigResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult>
++        '''
++        self.results = [MachineNetworkConfigResult.from_json(o) for o in results or []]
++
++
++
++class MachinePortRange(Type):
++    _toSchema = {'port_range': 'port-range', 'relation_tag': 'relation-tag', 'unit_tag': 'unit-tag'}
++    _toPy = {'port-range': 'port_range', 'relation-tag': 'relation_tag', 'unit-tag': 'unit_tag'}
++    def __init__(self, port_range=None, relation_tag=None, unit_tag=None, **unknown_fields):
++        '''
++        port_range : PortRange
++        relation_tag : str
++        unit_tag : str
++        '''
++        self.port_range = PortRange.from_json(port_range) if port_range else None
++        self.relation_tag = relation_tag
++        self.unit_tag = unit_tag
++
++
++
++class MachinePorts(Type):
++    _toSchema = {'machine_tag': 'machine-tag', 'subnet_tag': 'subnet-tag'}
++    _toPy = {'machine-tag': 'machine_tag', 'subnet-tag': 'subnet_tag'}
++    def __init__(self, machine_tag=None, subnet_tag=None, **unknown_fields):
++        '''
++        machine_tag : str
++        subnet_tag : str
++        '''
++        self.machine_tag = machine_tag
++        self.subnet_tag = subnet_tag
++
++
++
++class MachinePortsParams(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~MachinePorts]<~MachinePorts>
++        '''
++        self.params = [MachinePorts.from_json(o) for o in params or []]
++
++
++
++class MachinePortsResult(Type):
++    _toSchema = {'error': 'error', 'ports': 'ports'}
++    _toPy = {'error': 'error', 'ports': 'ports'}
++    def __init__(self, error=None, ports=None, **unknown_fields):
++        '''
++        error : Error
++        ports : typing.Sequence<+T_co>[~MachinePortRange]<~MachinePortRange>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.ports = [MachinePortRange.from_json(o) for o in ports or []]
++
++
++
++class MachinePortsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult>
++        '''
++        self.results = [MachinePortsResult.from_json(o) for o in results or []]
++
++
++
++class MachineStatus(Type):
++    _toSchema = {'agent_status': 'agent-status', 'containers': 'containers', 'dns_name': 'dns-name', 'hardware': 'hardware', 'has_vote': 'has-vote', 'id_': 'id', 'instance_id': 'instance-id', 'instance_status': 'instance-status', 'ip_addresses': 'ip-addresses', 'jobs': 'jobs', 'series': 'series', 'wants_vote': 'wants-vote'}
++    _toPy = {'agent-status': 'agent_status', 'containers': 'containers', 'dns-name': 'dns_name', 'hardware': 'hardware', 'has-vote': 'has_vote', 'id': 'id_', 'instance-id': 'instance_id', 'instance-status': 'instance_status', 'ip-addresses': 'ip_addresses', 'jobs': 'jobs', 'series': 'series', 'wants-vote': 'wants_vote'}
++    def __init__(self, agent_status=None, containers=None, dns_name=None, hardware=None, has_vote=None, id_=None, instance_id=None, instance_status=None, ip_addresses=None, jobs=None, series=None, wants_vote=None, **unknown_fields):
++        '''
++        agent_status : DetailedStatus
++        containers : typing.Mapping<~KT, +VT_co>[str, ~MachineStatus]<~MachineStatus>
++        dns_name : str
++        hardware : str
++        has_vote : bool
++        id_ : str
++        instance_id : str
++        instance_status : DetailedStatus
++        ip_addresses : typing.Sequence<+T_co>[str]
++        jobs : typing.Sequence<+T_co>[str]
++        series : str
++        wants_vote : bool
++        '''
++        self.agent_status = DetailedStatus.from_json(agent_status) if agent_status else None
++        self.containers = containers
++        self.dns_name = dns_name
++        self.hardware = hardware
++        self.has_vote = has_vote
++        self.id_ = id_
++        self.instance_id = instance_id
++        self.instance_status = DetailedStatus.from_json(instance_status) if instance_status else None
++        self.ip_addresses = ip_addresses
++        self.jobs = jobs
++        self.series = series
++        self.wants_vote = wants_vote
++
++
++
++class MachineStorageId(Type):
++    _toSchema = {'attachment_tag': 'attachment-tag', 'machine_tag': 'machine-tag'}
++    _toPy = {'attachment-tag': 'attachment_tag', 'machine-tag': 'machine_tag'}
++    def __init__(self, attachment_tag=None, machine_tag=None, **unknown_fields):
++        '''
++        attachment_tag : str
++        machine_tag : str
++        '''
++        self.attachment_tag = attachment_tag
++        self.machine_tag = machine_tag
++
++
++
++class MachineStorageIds(Type):
++    _toSchema = {'ids': 'ids'}
++    _toPy = {'ids': 'ids'}
++    def __init__(self, ids=None, **unknown_fields):
++        '''
++        ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        '''
++        self.ids = [MachineStorageId.from_json(o) for o in ids or []]
++
++
++
++class MachineStorageIdsWatchResult(Type):
++    _toSchema = {'changes': 'changes', 'error': 'error', 'watcher_id': 'watcher-id'}
++    _toPy = {'changes': 'changes', 'error': 'error', 'watcher-id': 'watcher_id'}
++    def __init__(self, changes=None, error=None, watcher_id=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>
++        error : Error
++        watcher_id : str
++        '''
++        self.changes = [MachineStorageId.from_json(o) for o in changes or []]
++        self.error = Error.from_json(error) if error else None
++        self.watcher_id = watcher_id
++
++
++
++class MachineStorageIdsWatchResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult>
++        '''
++        self.results = [MachineStorageIdsWatchResult.from_json(o) for o in results or []]
++
++
++
++class MapResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class MapResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MapResult]<~MapResult>
++        '''
++        self.results = [MapResult.from_json(o) for o in results or []]
++
++
++
++class MasterMigrationStatus(Type):
++    _toSchema = {'migration_id': 'migration-id', 'phase': 'phase', 'phase_changed_time': 'phase-changed-time', 'spec': 'spec'}
++    _toPy = {'migration-id': 'migration_id', 'phase': 'phase', 'phase-changed-time': 'phase_changed_time', 'spec': 'spec'}
++    def __init__(self, migration_id=None, phase=None, phase_changed_time=None, spec=None, **unknown_fields):
++        '''
++        migration_id : str
++        phase : str
++        phase_changed_time : str
++        spec : MigrationSpec
++        '''
++        self.migration_id = migration_id
++        self.phase = phase
++        self.phase_changed_time = phase_changed_time
++        self.spec = MigrationSpec.from_json(spec) if spec else None
++
++
++
++class Member(Type):
++    _toSchema = {'address': 'Address', 'arbiter': 'Arbiter', 'buildindexes': 'BuildIndexes', 'hidden': 'Hidden', 'id_': 'Id', 'priority': 'Priority', 'slavedelay': 'SlaveDelay', 'tags': 'Tags', 'votes': 'Votes'}
++    _toPy = {'Address': 'address', 'Arbiter': 'arbiter', 'BuildIndexes': 'buildindexes', 'Hidden': 'hidden', 'Id': 'id_', 'Priority': 'priority', 'SlaveDelay': 'slavedelay', 'Tags': 'tags', 'Votes': 'votes'}
++    def __init__(self, address=None, arbiter=None, buildindexes=None, hidden=None, id_=None, priority=None, slavedelay=None, tags=None, votes=None, **unknown_fields):
++        '''
++        address : str
++        arbiter : bool
++        buildindexes : bool
++        hidden : bool
++        id_ : int
++        priority : float
++        slavedelay : int
++        tags : typing.Mapping<~KT, +VT_co>[str, str]
++        votes : int
++        '''
++        self.address = address
++        self.arbiter = arbiter
++        self.buildindexes = buildindexes
++        self.hidden = hidden
++        self.id_ = id_
++        self.priority = priority
++        self.slavedelay = slavedelay
++        self.tags = tags
++        self.votes = votes
++
++
++
++class MergeLeadershipSettingsBulkParams(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam>
++        '''
++        self.params = [MergeLeadershipSettingsParam.from_json(o) for o in params or []]
++
++
++
++class MergeLeadershipSettingsParam(Type):
++    _toSchema = {'application_tag': 'application-tag', 'settings': 'settings'}
++    _toPy = {'application-tag': 'application_tag', 'settings': 'settings'}
++    def __init__(self, application_tag=None, settings=None, **unknown_fields):
++        '''
++        application_tag : str
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        self.application_tag = application_tag
++        self.settings = settings
++
++
++
++class MetadataImageIds(Type):
++    _toSchema = {'image_ids': 'image-ids'}
++    _toPy = {'image-ids': 'image_ids'}
++    def __init__(self, image_ids=None, **unknown_fields):
++        '''
++        image_ids : typing.Sequence<+T_co>[str]
++        '''
++        self.image_ids = image_ids
++
++
++
++class MetadataSaveParams(Type):
++    _toSchema = {'metadata': 'metadata'}
++    _toPy = {'metadata': 'metadata'}
++    def __init__(self, metadata=None, **unknown_fields):
++        '''
++        metadata : typing.Sequence<+T_co>[~CloudImageMetadataList]<~CloudImageMetadataList>
++        '''
++        self.metadata = [CloudImageMetadataList.from_json(o) for o in metadata or []]
++
++
++
++class MeterStatus(Type):
++    _toSchema = {'color': 'color', 'message': 'message'}
++    _toPy = {'color': 'color', 'message': 'message'}
++    def __init__(self, color=None, message=None, **unknown_fields):
++        '''
++        color : str
++        message : str
++        '''
++        self.color = color
++        self.message = message
++
++
++
++class MeterStatusParam(Type):
++    _toSchema = {'code': 'code', 'info': 'info', 'tag': 'tag'}
++    _toPy = {'code': 'code', 'info': 'info', 'tag': 'tag'}
++    def __init__(self, code=None, info=None, tag=None, **unknown_fields):
++        '''
++        code : str
++        info : str
++        tag : str
++        '''
++        self.code = code
++        self.info = info
++        self.tag = tag
++
++
++
++class MeterStatusParams(Type):
++    _toSchema = {'statues': 'statues'}
++    _toPy = {'statues': 'statues'}
++    def __init__(self, statues=None, **unknown_fields):
++        '''
++        statues : typing.Sequence<+T_co>[~MeterStatusParam]<~MeterStatusParam>
++        '''
++        self.statues = [MeterStatusParam.from_json(o) for o in statues or []]
++
++
++
++class MeterStatusResult(Type):
++    _toSchema = {'code': 'code', 'error': 'error', 'info': 'info'}
++    _toPy = {'code': 'code', 'error': 'error', 'info': 'info'}
++    def __init__(self, code=None, error=None, info=None, **unknown_fields):
++        '''
++        code : str
++        error : Error
++        info : str
++        '''
++        self.code = code
++        self.error = Error.from_json(error) if error else None
++        self.info = info
++
++
++
++class MeterStatusResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult>
++        '''
++        self.results = [MeterStatusResult.from_json(o) for o in results or []]
++
++
++
++class Metric(Type):
++    _toSchema = {'key': 'key', 'time': 'time', 'value': 'value'}
++    _toPy = {'key': 'key', 'time': 'time', 'value': 'value'}
++    def __init__(self, key=None, time=None, value=None, **unknown_fields):
++        '''
++        key : str
++        time : str
++        value : str
++        '''
++        self.key = key
++        self.time = time
++        self.value = value
++
++
++
++class MetricBatch(Type):
++    _toSchema = {'charm_url': 'charm-url', 'created': 'created', 'metrics': 'metrics', 'uuid': 'uuid'}
++    _toPy = {'charm-url': 'charm_url', 'created': 'created', 'metrics': 'metrics', 'uuid': 'uuid'}
++    def __init__(self, charm_url=None, created=None, metrics=None, uuid=None, **unknown_fields):
++        '''
++        charm_url : str
++        created : str
++        metrics : typing.Sequence<+T_co>[~Metric]<~Metric>
++        uuid : str
++        '''
++        self.charm_url = charm_url
++        self.created = created
++        self.metrics = [Metric.from_json(o) for o in metrics or []]
++        self.uuid = uuid
++
++
++
++class MetricBatchParam(Type):
++    _toSchema = {'batch': 'batch', 'tag': 'tag'}
++    _toPy = {'batch': 'batch', 'tag': 'tag'}
++    def __init__(self, batch=None, tag=None, **unknown_fields):
++        '''
++        batch : MetricBatch
++        tag : str
++        '''
++        self.batch = MetricBatch.from_json(batch) if batch else None
++        self.tag = tag
++
++
++
++class MetricBatchParams(Type):
++    _toSchema = {'batches': 'batches'}
++    _toPy = {'batches': 'batches'}
++    def __init__(self, batches=None, **unknown_fields):
++        '''
++        batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam>
++        '''
++        self.batches = [MetricBatchParam.from_json(o) for o in batches or []]
++
++
++
++class MetricResult(Type):
++    _toSchema = {'key': 'key', 'time': 'time', 'unit': 'unit', 'value': 'value'}
++    _toPy = {'key': 'key', 'time': 'time', 'unit': 'unit', 'value': 'value'}
++    def __init__(self, key=None, time=None, unit=None, value=None, **unknown_fields):
++        '''
++        key : str
++        time : str
++        unit : str
++        value : str
++        '''
++        self.key = key
++        self.time = time
++        self.unit = unit
++        self.value = value
++
++
++
++class MetricResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~EntityMetrics]<~EntityMetrics>
++        '''
++        self.results = [EntityMetrics.from_json(o) for o in results or []]
++
++
++
++class MigrationModelInfo(Type):
++    _toSchema = {'agent_version': 'agent-version', 'name': 'name', 'owner_tag': 'owner-tag', 'uuid': 'uuid'}
++    _toPy = {'agent-version': 'agent_version', 'name': 'name', 'owner-tag': 'owner_tag', 'uuid': 'uuid'}
++    def __init__(self, agent_version=None, name=None, owner_tag=None, uuid=None, **unknown_fields):
++        '''
++        agent_version : Number
++        name : str
++        owner_tag : str
++        uuid : str
++        '''
++        self.agent_version = Number.from_json(agent_version) if agent_version else None
++        self.name = name
++        self.owner_tag = owner_tag
++        self.uuid = uuid
++
++
++
++class MigrationSpec(Type):
++    _toSchema = {'external_control': 'external-control', 'model_tag': 'model-tag', 'skip_initial_prechecks': 'skip-initial-prechecks', 'target_info': 'target-info'}
++    _toPy = {'external-control': 'external_control', 'model-tag': 'model_tag', 'skip-initial-prechecks': 'skip_initial_prechecks', 'target-info': 'target_info'}
++    def __init__(self, external_control=None, model_tag=None, skip_initial_prechecks=None, target_info=None, **unknown_fields):
++        '''
++        external_control : bool
++        model_tag : str
++        skip_initial_prechecks : bool
++        target_info : MigrationTargetInfo
++        '''
++        self.external_control = external_control
++        self.model_tag = model_tag
++        self.skip_initial_prechecks = skip_initial_prechecks
++        self.target_info = MigrationTargetInfo.from_json(target_info) if target_info else None
++
++
++
++class MigrationStatus(Type):
++    _toSchema = {'attempt': 'attempt', 'external_control': 'external-control', 'migration_id': 'migration-id', 'phase': 'phase', 'source_api_addrs': 'source-api-addrs', 'source_ca_cert': 'source-ca-cert', 'target_api_addrs': 'target-api-addrs', 'target_ca_cert': 'target-ca-cert'}
++    _toPy = {'attempt': 'attempt', 'external-control': 'external_control', 'migration-id': 'migration_id', 'phase': 'phase', 'source-api-addrs': 'source_api_addrs', 'source-ca-cert': 'source_ca_cert', 'target-api-addrs': 'target_api_addrs', 'target-ca-cert': 'target_ca_cert'}
++    def __init__(self, attempt=None, external_control=None, migration_id=None, phase=None, source_api_addrs=None, source_ca_cert=None, target_api_addrs=None, target_ca_cert=None, **unknown_fields):
++        '''
++        attempt : int
++        external_control : bool
++        migration_id : str
++        phase : str
++        source_api_addrs : typing.Sequence<+T_co>[str]
++        source_ca_cert : str
++        target_api_addrs : typing.Sequence<+T_co>[str]
++        target_ca_cert : str
++        '''
++        self.attempt = attempt
++        self.external_control = external_control
++        self.migration_id = migration_id
++        self.phase = phase
++        self.source_api_addrs = source_api_addrs
++        self.source_ca_cert = source_ca_cert
++        self.target_api_addrs = target_api_addrs
++        self.target_ca_cert = target_ca_cert
++
++
++
++class MigrationTargetInfo(Type):
++    _toSchema = {'addrs': 'addrs', 'auth_tag': 'auth-tag', 'ca_cert': 'ca-cert', 'controller_tag': 'controller-tag', 'macaroons': 'macaroons', 'password': 'password'}
++    _toPy = {'addrs': 'addrs', 'auth-tag': 'auth_tag', 'ca-cert': 'ca_cert', 'controller-tag': 'controller_tag', 'macaroons': 'macaroons', 'password': 'password'}
++    def __init__(self, addrs=None, auth_tag=None, ca_cert=None, controller_tag=None, macaroons=None, password=None, **unknown_fields):
++        '''
++        addrs : typing.Sequence<+T_co>[str]
++        auth_tag : str
++        ca_cert : str
++        controller_tag : str
++        macaroons : str
++        password : str
++        '''
++        self.addrs = addrs
++        self.auth_tag = auth_tag
++        self.ca_cert = ca_cert
++        self.controller_tag = controller_tag
++        self.macaroons = macaroons
++        self.password = password
++
++
++
++class MinionReport(Type):
++    _toSchema = {'migration_id': 'migration-id', 'phase': 'phase', 'success': 'success'}
++    _toPy = {'migration-id': 'migration_id', 'phase': 'phase', 'success': 'success'}
++    def __init__(self, migration_id=None, phase=None, success=None, **unknown_fields):
++        '''
++        migration_id : str
++        phase : str
++        success : bool
++        '''
++        self.migration_id = migration_id
++        self.phase = phase
++        self.success = success
++
++
++
++class MinionReports(Type):
++    _toSchema = {'failed': 'failed', 'migration_id': 'migration-id', 'phase': 'phase', 'success_count': 'success-count', 'unknown_count': 'unknown-count', 'unknown_sample': 'unknown-sample'}
++    _toPy = {'failed': 'failed', 'migration-id': 'migration_id', 'phase': 'phase', 'success-count': 'success_count', 'unknown-count': 'unknown_count', 'unknown-sample': 'unknown_sample'}
++    def __init__(self, failed=None, migration_id=None, phase=None, success_count=None, unknown_count=None, unknown_sample=None, **unknown_fields):
++        '''
++        failed : typing.Sequence<+T_co>[str]
++        migration_id : str
++        phase : str
++        success_count : int
++        unknown_count : int
++        unknown_sample : typing.Sequence<+T_co>[str]
++        '''
++        self.failed = failed
++        self.migration_id = migration_id
++        self.phase = phase
++        self.success_count = success_count
++        self.unknown_count = unknown_count
++        self.unknown_sample = unknown_sample
++
++
++
++class Model(Type):
++    _toSchema = {'name': 'name', 'owner_tag': 'owner-tag', 'uuid': 'uuid'}
++    _toPy = {'name': 'name', 'owner-tag': 'owner_tag', 'uuid': 'uuid'}
++    def __init__(self, name=None, owner_tag=None, uuid=None, **unknown_fields):
++        '''
++        name : str
++        owner_tag : str
++        uuid : str
++        '''
++        self.name = name
++        self.owner_tag = owner_tag
++        self.uuid = uuid
++
++
++
++class ModelArgs(Type):
++    _toSchema = {'model_tag': 'model-tag'}
++    _toPy = {'model-tag': 'model_tag'}
++    def __init__(self, model_tag=None, **unknown_fields):
++        '''
++        model_tag : str
++        '''
++        self.model_tag = model_tag
++
++
++
++class ModelBlockInfo(Type):
++    _toSchema = {'blocks': 'blocks', 'model_uuid': 'model-uuid', 'name': 'name', 'owner_tag': 'owner-tag'}
++    _toPy = {'blocks': 'blocks', 'model-uuid': 'model_uuid', 'name': 'name', 'owner-tag': 'owner_tag'}
++    def __init__(self, blocks=None, model_uuid=None, name=None, owner_tag=None, **unknown_fields):
++        '''
++        blocks : typing.Sequence<+T_co>[str]
++        model_uuid : str
++        name : str
++        owner_tag : str
++        '''
++        self.blocks = blocks
++        self.model_uuid = model_uuid
++        self.name = name
++        self.owner_tag = owner_tag
++
++
++
++class ModelBlockInfoList(Type):
++    _toSchema = {'models': 'models'}
++    _toPy = {'models': 'models'}
++    def __init__(self, models=None, **unknown_fields):
++        '''
++        models : typing.Sequence<+T_co>[~ModelBlockInfo]<~ModelBlockInfo>
++        '''
++        self.models = [ModelBlockInfo.from_json(o) for o in models or []]
++
++
++
++class ModelConfigResult(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.config = config
++
++
++
++class ModelConfigResults(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue>
++        '''
++        self.config = config
++
++
++
++class ModelCreateArgs(Type):
++    _toSchema = {'cloud_tag': 'cloud-tag', 'config': 'config', 'credential': 'credential', 'name': 'name', 'owner_tag': 'owner-tag', 'region': 'region'}
++    _toPy = {'cloud-tag': 'cloud_tag', 'config': 'config', 'credential': 'credential', 'name': 'name', 'owner-tag': 'owner_tag', 'region': 'region'}
++    def __init__(self, cloud_tag=None, config=None, credential=None, name=None, owner_tag=None, region=None, **unknown_fields):
++        '''
++        cloud_tag : str
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        credential : str
++        name : str
++        owner_tag : str
++        region : str
++        '''
++        self.cloud_tag = cloud_tag
++        self.config = config
++        self.credential = credential
++        self.name = name
++        self.owner_tag = owner_tag
++        self.region = region
++
++
++
++class ModelDefaultValues(Type):
++    _toSchema = {'cloud_region': 'cloud-region', 'cloud_tag': 'cloud-tag', 'config': 'config'}
++    _toPy = {'cloud-region': 'cloud_region', 'cloud-tag': 'cloud_tag', 'config': 'config'}
++    def __init__(self, cloud_region=None, cloud_tag=None, config=None, **unknown_fields):
++        '''
++        cloud_region : str
++        cloud_tag : str
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.cloud_region = cloud_region
++        self.cloud_tag = cloud_tag
++        self.config = config
++
++
++
++class ModelDefaults(Type):
++    _toSchema = {'controller': 'controller', 'default': 'default', 'regions': 'regions'}
++    _toPy = {'controller': 'controller', 'default': 'default', 'regions': 'regions'}
++    def __init__(self, controller=None, default=None, regions=None, **unknown_fields):
++        '''
++        controller : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        default : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        regions : typing.Sequence<+T_co>[~RegionDefaults]<~RegionDefaults>
++        '''
++        self.controller = controller
++        self.default = default
++        self.regions = [RegionDefaults.from_json(o) for o in regions or []]
++
++
++
++class ModelDefaultsResult(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults>
++        '''
++        self.config = config
++
++
++
++class ModelInfo(Type):
++    _toSchema = {'agent_version': 'agent-version', 'cloud_credential_tag': 'cloud-credential-tag', 'cloud_region': 'cloud-region', 'cloud_tag': 'cloud-tag', 'controller_uuid': 'controller-uuid', 'default_series': 'default-series', 'life': 'life', 'machines': 'machines', 'migration': 'migration', 'name': 'name', 'owner_tag': 'owner-tag', 'provider_type': 'provider-type', 'sla': 'sla', 'status': 'status', 'users': 'users', 'uuid': 'uuid'}
++    _toPy = {'agent-version': 'agent_version', 'cloud-credential-tag': 'cloud_credential_tag', 'cloud-region': 'cloud_region', 'cloud-tag': 'cloud_tag', 'controller-uuid': 'controller_uuid', 'default-series': 'default_series', 'life': 'life', 'machines': 'machines', 'migration': 'migration', 'name': 'name', 'owner-tag': 'owner_tag', 'provider-type': 'provider_type', 'sla': 'sla', 'status': 'status', 'users': 'users', 'uuid': 'uuid'}
++    def __init__(self, agent_version=None, cloud_credential_tag=None, cloud_region=None, cloud_tag=None, controller_uuid=None, default_series=None, life=None, machines=None, migration=None, name=None, owner_tag=None, provider_type=None, sla=None, status=None, users=None, uuid=None, **unknown_fields):
++        '''
++        agent_version : Number
++        cloud_credential_tag : str
++        cloud_region : str
++        cloud_tag : str
++        controller_uuid : str
++        default_series : str
++        life : str
++        machines : typing.Sequence<+T_co>[~ModelMachineInfo]<~ModelMachineInfo>
++        migration : ModelMigrationStatus
++        name : str
++        owner_tag : str
++        provider_type : str
++        sla : ModelSLAInfo
++        status : EntityStatus
++        users : typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo>
++        uuid : str
++        '''
++        self.agent_version = Number.from_json(agent_version) if agent_version else None
++        self.cloud_credential_tag = cloud_credential_tag
++        self.cloud_region = cloud_region
++        self.cloud_tag = cloud_tag
++        self.controller_uuid = controller_uuid
++        self.default_series = default_series
++        self.life = life
++        self.machines = [ModelMachineInfo.from_json(o) for o in machines or []]
++        self.migration = ModelMigrationStatus.from_json(migration) if migration else None
++        self.name = name
++        self.owner_tag = owner_tag
++        self.provider_type = provider_type
++        self.sla = ModelSLAInfo.from_json(sla) if sla else None
++        self.status = EntityStatus.from_json(status) if status else None
++        self.users = [ModelUserInfo.from_json(o) for o in users or []]
++        self.uuid = uuid
++
++
++
++class ModelInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : ModelInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = ModelInfo.from_json(result) if result else None
++
++
++
++class ModelInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult>
++        '''
++        self.results = [ModelInfoResult.from_json(o) for o in results or []]
++
++
++
++class ModelInstanceTypesConstraint(Type):
++    _toSchema = {'value': 'value'}
++    _toPy = {'value': 'value'}
++    def __init__(self, value=None, **unknown_fields):
++        '''
++        value : Value
++        '''
++        self.value = Value.from_json(value) if value else None
++
++
++
++class ModelInstanceTypesConstraints(Type):
++    _toSchema = {'constraints': 'constraints'}
++    _toPy = {'constraints': 'constraints'}
++    def __init__(self, constraints=None, **unknown_fields):
++        '''
++        constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint>
++        '''
++        self.constraints = [ModelInstanceTypesConstraint.from_json(o) for o in constraints or []]
++
++
++
++class ModelMachineInfo(Type):
++    _toSchema = {'hardware': 'hardware', 'has_vote': 'has-vote', 'id_': 'id', 'instance_id': 'instance-id', 'status': 'status', 'wants_vote': 'wants-vote'}
++    _toPy = {'hardware': 'hardware', 'has-vote': 'has_vote', 'id': 'id_', 'instance-id': 'instance_id', 'status': 'status', 'wants-vote': 'wants_vote'}
++    def __init__(self, hardware=None, has_vote=None, id_=None, instance_id=None, status=None, wants_vote=None, **unknown_fields):
++        '''
++        hardware : MachineHardware
++        has_vote : bool
++        id_ : str
++        instance_id : str
++        status : str
++        wants_vote : bool
++        '''
++        self.hardware = MachineHardware.from_json(hardware) if hardware else None
++        self.has_vote = has_vote
++        self.id_ = id_
++        self.instance_id = instance_id
++        self.status = status
++        self.wants_vote = wants_vote
++
++
++
++class ModelMigrationStatus(Type):
++    _toSchema = {'end': 'end', 'start': 'start', 'status': 'status'}
++    _toPy = {'end': 'end', 'start': 'start', 'status': 'status'}
++    def __init__(self, end=None, start=None, status=None, **unknown_fields):
++        '''
++        end : str
++        start : str
++        status : str
++        '''
++        self.end = end
++        self.start = start
++        self.status = status
++
++
++
++class ModelResult(Type):
++    _toSchema = {'error': 'error', 'name': 'name', 'uuid': 'uuid'}
++    _toPy = {'error': 'error', 'name': 'name', 'uuid': 'uuid'}
++    def __init__(self, error=None, name=None, uuid=None, **unknown_fields):
++        '''
++        error : Error
++        name : str
++        uuid : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++        self.uuid = uuid
++
++
++
++class ModelSLA(Type):
++    _toSchema = {'creds': 'creds', 'level': 'level'}
++    _toPy = {'creds': 'creds', 'level': 'level'}
++    def __init__(self, creds=None, level=None, **unknown_fields):
++        '''
++        creds : typing.Sequence<+T_co>[int]
++        level : str
++        '''
++        self.creds = creds
++        self.level = level
++
++
++
++class ModelSLAInfo(Type):
++    _toSchema = {'level': 'level', 'owner': 'owner'}
++    _toPy = {'level': 'level', 'owner': 'owner'}
++    def __init__(self, level=None, owner=None, **unknown_fields):
++        '''
++        level : str
++        owner : str
++        '''
++        self.level = level
++        self.owner = owner
++
++
++
++class ModelSet(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.config = config
++
++
++
++class ModelStatus(Type):
++    _toSchema = {'application_count': 'application-count', 'hosted_machine_count': 'hosted-machine-count', 'life': 'life', 'machines': 'machines', 'model_tag': 'model-tag', 'owner_tag': 'owner-tag'}
++    _toPy = {'application-count': 'application_count', 'hosted-machine-count': 'hosted_machine_count', 'life': 'life', 'machines': 'machines', 'model-tag': 'model_tag', 'owner-tag': 'owner_tag'}
++    def __init__(self, application_count=None, hosted_machine_count=None, life=None, machines=None, model_tag=None, owner_tag=None, **unknown_fields):
++        '''
++        application_count : int
++        hosted_machine_count : int
++        life : str
++        machines : typing.Sequence<+T_co>[~ModelMachineInfo]<~ModelMachineInfo>
++        model_tag : str
++        owner_tag : str
++        '''
++        self.application_count = application_count
++        self.hosted_machine_count = hosted_machine_count
++        self.life = life
++        self.machines = [ModelMachineInfo.from_json(o) for o in machines or []]
++        self.model_tag = model_tag
++        self.owner_tag = owner_tag
++
++
++
++class ModelStatusInfo(Type):
++    _toSchema = {'available_version': 'available-version', 'cloud_tag': 'cloud-tag', 'meter_status': 'meter-status', 'model_status': 'model-status', 'name': 'name', 'region': 'region', 'sla': 'sla', 'version': 'version'}
++    _toPy = {'available-version': 'available_version', 'cloud-tag': 'cloud_tag', 'meter-status': 'meter_status', 'model-status': 'model_status', 'name': 'name', 'region': 'region', 'sla': 'sla', 'version': 'version'}
++    def __init__(self, available_version=None, cloud_tag=None, meter_status=None, model_status=None, name=None, region=None, sla=None, version=None, **unknown_fields):
++        '''
++        available_version : str
++        cloud_tag : str
++        meter_status : MeterStatus
++        model_status : DetailedStatus
++        name : str
++        region : str
++        sla : str
++        version : str
++        '''
++        self.available_version = available_version
++        self.cloud_tag = cloud_tag
++        self.meter_status = MeterStatus.from_json(meter_status) if meter_status else None
++        self.model_status = DetailedStatus.from_json(model_status) if model_status else None
++        self.name = name
++        self.region = region
++        self.sla = sla
++        self.version = version
++
++
++
++class ModelStatusResults(Type):
++    _toSchema = {'models': 'models'}
++    _toPy = {'models': 'models'}
++    def __init__(self, models=None, **unknown_fields):
++        '''
++        models : typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus>
++        '''
++        self.models = [ModelStatus.from_json(o) for o in models or []]
++
++
++
++class ModelTag(Type):
++    _toSchema = {}
++    _toPy = {}
++    def __init__(self, **unknown_fields):
++        '''
++
++        '''
++        pass
++
++
++
++class ModelUnset(Type):
++    _toSchema = {'keys': 'keys'}
++    _toPy = {'keys': 'keys'}
++    def __init__(self, keys=None, **unknown_fields):
++        '''
++        keys : typing.Sequence<+T_co>[str]
++        '''
++        self.keys = keys
++
++
++
++class ModelUnsetKeys(Type):
++    _toSchema = {'cloud_region': 'cloud-region', 'cloud_tag': 'cloud-tag', 'keys': 'keys'}
++    _toPy = {'cloud-region': 'cloud_region', 'cloud-tag': 'cloud_tag', 'keys': 'keys'}
++    def __init__(self, cloud_region=None, cloud_tag=None, keys=None, **unknown_fields):
++        '''
++        cloud_region : str
++        cloud_tag : str
++        keys : typing.Sequence<+T_co>[str]
++        '''
++        self.cloud_region = cloud_region
++        self.cloud_tag = cloud_tag
++        self.keys = keys
++
++
++
++class ModelUserInfo(Type):
++    _toSchema = {'access': 'access', 'display_name': 'display-name', 'last_connection': 'last-connection', 'user': 'user'}
++    _toPy = {'access': 'access', 'display-name': 'display_name', 'last-connection': 'last_connection', 'user': 'user'}
++    def __init__(self, access=None, display_name=None, last_connection=None, user=None, **unknown_fields):
++        '''
++        access : str
++        display_name : str
++        last_connection : str
++        user : str
++        '''
++        self.access = access
++        self.display_name = display_name
++        self.last_connection = last_connection
++        self.user = user
++
++
++
++class ModelUserInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : ModelUserInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = ModelUserInfo.from_json(result) if result else None
++
++
++
++class ModelUserInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ModelUserInfoResult]<~ModelUserInfoResult>
++        '''
++        self.results = [ModelUserInfoResult.from_json(o) for o in results or []]
++
++
++
++class ModifyControllerAccess(Type):
++    _toSchema = {'access': 'access', 'action': 'action', 'user_tag': 'user-tag'}
++    _toPy = {'access': 'access', 'action': 'action', 'user-tag': 'user_tag'}
++    def __init__(self, access=None, action=None, user_tag=None, **unknown_fields):
++        '''
++        access : str
++        action : str
++        user_tag : str
++        '''
++        self.access = access
++        self.action = action
++        self.user_tag = user_tag
++
++
++
++class ModifyControllerAccessRequest(Type):
++    _toSchema = {'changes': 'changes'}
++    _toPy = {'changes': 'changes'}
++    def __init__(self, changes=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[~ModifyControllerAccess]<~ModifyControllerAccess>
++        '''
++        self.changes = [ModifyControllerAccess.from_json(o) for o in changes or []]
++
++
++
++class ModifyModelAccess(Type):
++    _toSchema = {'access': 'access', 'action': 'action', 'model_tag': 'model-tag', 'user_tag': 'user-tag'}
++    _toPy = {'access': 'access', 'action': 'action', 'model-tag': 'model_tag', 'user-tag': 'user_tag'}
++    def __init__(self, access=None, action=None, model_tag=None, user_tag=None, **unknown_fields):
++        '''
++        access : str
++        action : str
++        model_tag : str
++        user_tag : str
++        '''
++        self.access = access
++        self.action = action
++        self.model_tag = model_tag
++        self.user_tag = user_tag
++
++
++
++class ModifyModelAccessRequest(Type):
++    _toSchema = {'changes': 'changes'}
++    _toPy = {'changes': 'changes'}
++    def __init__(self, changes=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess>
++        '''
++        self.changes = [ModifyModelAccess.from_json(o) for o in changes or []]
++
++
++
++class ModifyUserSSHKeys(Type):
++    _toSchema = {'ssh_keys': 'ssh-keys', 'user': 'user'}
++    _toPy = {'ssh-keys': 'ssh_keys', 'user': 'user'}
++    def __init__(self, ssh_keys=None, user=None, **unknown_fields):
++        '''
++        ssh_keys : typing.Sequence<+T_co>[str]
++        user : str
++        '''
++        self.ssh_keys = ssh_keys
++        self.user = user
++
++
++
++class MongoUpgradeResults(Type):
++    _toSchema = {'ha_members': 'ha-members', 'master': 'master', 'rs_members': 'rs-members'}
++    _toPy = {'ha-members': 'ha_members', 'master': 'master', 'rs-members': 'rs_members'}
++    def __init__(self, ha_members=None, master=None, rs_members=None, **unknown_fields):
++        '''
++        ha_members : typing.Sequence<+T_co>[~HAMember]<~HAMember>
++        master : HAMember
++        rs_members : typing.Sequence<+T_co>[~Member]<~Member>
++        '''
++        self.ha_members = [HAMember.from_json(o) for o in ha_members or []]
++        self.master = HAMember.from_json(master) if master else None
++        self.rs_members = [Member.from_json(o) for o in rs_members or []]
++
++
++
++class MongoVersion(Type):
++    _toSchema = {'engine': 'engine', 'major': 'major', 'minor': 'minor', 'patch': 'patch'}
++    _toPy = {'engine': 'engine', 'major': 'major', 'minor': 'minor', 'patch': 'patch'}
++    def __init__(self, engine=None, major=None, minor=None, patch=None, **unknown_fields):
++        '''
++        engine : str
++        major : int
++        minor : int
++        patch : str
++        '''
++        self.engine = engine
++        self.major = major
++        self.minor = minor
++        self.patch = patch
++
++
++
++class NetworkConfig(Type):
++    _toSchema = {'address': 'address', 'cidr': 'cidr', 'config_type': 'config-type', 'device_index': 'device-index', 'disabled': 'disabled', 'dns_search_domains': 'dns-search-domains', 'dns_servers': 'dns-servers', 'gateway_address': 'gateway-address', 'interface_name': 'interface-name', 'interface_type': 'interface-type', 'mac_address': 'mac-address', 'mtu': 'mtu', 'no_auto_start': 'no-auto-start', 'parent_interface_name': 'parent-interface-name', 'provider_address_id': 'provider-address-id', 'provider_id': 'provider-id', 'provider_space_id': 'provider-space-id', 'provider_subnet_id': 'provider-subnet-id', 'provider_vlan_id': 'provider-vlan-id', 'vlan_tag': 'vlan-tag'}
++    _toPy = {'address': 'address', 'cidr': 'cidr', 'config-type': 'config_type', 'device-index': 'device_index', 'disabled': 'disabled', 'dns-search-domains': 'dns_search_domains', 'dns-servers': 'dns_servers', 'gateway-address': 'gateway_address', 'interface-name': 'interface_name', 'interface-type': 'interface_type', 'mac-address': 'mac_address', 'mtu': 'mtu', 'no-auto-start': 'no_auto_start', 'parent-interface-name': 'parent_interface_name', 'provider-address-id': 'provider_address_id', 'provider-id': 'provider_id', 'provider-space-id': 'provider_space_id', 'provider-subnet-id': 'provider_subnet_id', 'provider-vlan-id': 'provider_vlan_id', 'vlan-tag': 'vlan_tag'}
++    def __init__(self, address=None, cidr=None, config_type=None, device_index=None, disabled=None, dns_search_domains=None, dns_servers=None, gateway_address=None, interface_name=None, interface_type=None, mac_address=None, mtu=None, no_auto_start=None, parent_interface_name=None, provider_address_id=None, provider_id=None, provider_space_id=None, provider_subnet_id=None, provider_vlan_id=None, vlan_tag=None, **unknown_fields):
++        '''
++        address : str
++        cidr : str
++        config_type : str
++        device_index : int
++        disabled : bool
++        dns_search_domains : typing.Sequence<+T_co>[str]
++        dns_servers : typing.Sequence<+T_co>[str]
++        gateway_address : str
++        interface_name : str
++        interface_type : str
++        mac_address : str
++        mtu : int
++        no_auto_start : bool
++        parent_interface_name : str
++        provider_address_id : str
++        provider_id : str
++        provider_space_id : str
++        provider_subnet_id : str
++        provider_vlan_id : str
++        vlan_tag : int
++        '''
++        self.address = address
++        self.cidr = cidr
++        self.config_type = config_type
++        self.device_index = device_index
++        self.disabled = disabled
++        self.dns_search_domains = dns_search_domains
++        self.dns_servers = dns_servers
++        self.gateway_address = gateway_address
++        self.interface_name = interface_name
++        self.interface_type = interface_type
++        self.mac_address = mac_address
++        self.mtu = mtu
++        self.no_auto_start = no_auto_start
++        self.parent_interface_name = parent_interface_name
++        self.provider_address_id = provider_address_id
++        self.provider_id = provider_id
++        self.provider_space_id = provider_space_id
++        self.provider_subnet_id = provider_subnet_id
++        self.provider_vlan_id = provider_vlan_id
++        self.vlan_tag = vlan_tag
++
++
++
++class NetworkInfo(Type):
++    _toSchema = {'addresses': 'addresses', 'interface_name': 'interface-name', 'mac_address': 'mac-address'}
++    _toPy = {'addresses': 'addresses', 'interface-name': 'interface_name', 'mac-address': 'mac_address'}
++    def __init__(self, addresses=None, interface_name=None, mac_address=None, **unknown_fields):
++        '''
++        addresses : typing.Sequence<+T_co>[~InterfaceAddress]<~InterfaceAddress>
++        interface_name : str
++        mac_address : str
++        '''
++        self.addresses = [InterfaceAddress.from_json(o) for o in addresses or []]
++        self.interface_name = interface_name
++        self.mac_address = mac_address
++
++
++
++class NetworkInfoParams(Type):
++    _toSchema = {'bindings': 'bindings', 'unit': 'unit'}
++    _toPy = {'bindings': 'bindings', 'unit': 'unit'}
++    def __init__(self, bindings=None, unit=None, **unknown_fields):
++        '''
++        bindings : typing.Sequence<+T_co>[str]
++        unit : str
++        '''
++        self.bindings = bindings
++        self.unit = unit
++
++
++
++class NetworkInfoResult(Type):
++    _toSchema = {'error': 'error', 'network_info': 'network-info'}
++    _toPy = {'error': 'error', 'network-info': 'network_info'}
++    def __init__(self, error=None, network_info=None, **unknown_fields):
++        '''
++        error : Error
++        network_info : typing.Sequence<+T_co>[~NetworkInfo]<~NetworkInfo>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.network_info = [NetworkInfo.from_json(o) for o in network_info or []]
++
++
++
++class NetworkInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Mapping<~KT, +VT_co>[str, ~NetworkInfoResult]<~NetworkInfoResult>
++        '''
++        self.results = results
++
++
++
++class NetworkInterface(Type):
++    _toSchema = {'dns_nameservers': 'dns-nameservers', 'gateway': 'gateway', 'ip_addresses': 'ip-addresses', 'is_up': 'is-up', 'mac_address': 'mac-address', 'space': 'space'}
++    _toPy = {'dns-nameservers': 'dns_nameservers', 'gateway': 'gateway', 'ip-addresses': 'ip_addresses', 'is-up': 'is_up', 'mac-address': 'mac_address', 'space': 'space'}
++    def __init__(self, dns_nameservers=None, gateway=None, ip_addresses=None, is_up=None, mac_address=None, space=None, **unknown_fields):
++        '''
++        dns_nameservers : typing.Sequence<+T_co>[str]
++        gateway : str
++        ip_addresses : typing.Sequence<+T_co>[str]
++        is_up : bool
++        mac_address : str
++        space : str
++        '''
++        self.dns_nameservers = dns_nameservers
++        self.gateway = gateway
++        self.ip_addresses = ip_addresses
++        self.is_up = is_up
++        self.mac_address = mac_address
++        self.space = space
++
++
++
++class NetworkRoute(Type):
++    _toSchema = {'destination_cidr': 'destination-cidr', 'gateway_ip': 'gateway-ip', 'metric': 'metric'}
++    _toPy = {'destination-cidr': 'destination_cidr', 'gateway-ip': 'gateway_ip', 'metric': 'metric'}
++    def __init__(self, destination_cidr=None, gateway_ip=None, metric=None, **unknown_fields):
++        '''
++        destination_cidr : str
++        gateway_ip : str
++        metric : int
++        '''
++        self.destination_cidr = destination_cidr
++        self.gateway_ip = gateway_ip
++        self.metric = metric
++
++
++
++class NotifyWatchResult(Type):
++    _toSchema = {'error': 'error', 'notifywatcherid': 'NotifyWatcherId'}
++    _toPy = {'NotifyWatcherId': 'notifywatcherid', 'error': 'error'}
++    def __init__(self, notifywatcherid=None, error=None, **unknown_fields):
++        '''
++        notifywatcherid : str
++        error : Error
++        '''
++        self.notifywatcherid = notifywatcherid
++        self.error = Error.from_json(error) if error else None
++
++
++
++class NotifyWatchResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
++        '''
++        self.results = [NotifyWatchResult.from_json(o) for o in results or []]
++
++
++
++class Number(Type):
++    _toSchema = {'build': 'Build', 'major': 'Major', 'minor': 'Minor', 'patch': 'Patch', 'tag': 'Tag'}
++    _toPy = {'Build': 'build', 'Major': 'major', 'Minor': 'minor', 'Patch': 'patch', 'Tag': 'tag'}
++    def __init__(self, build=None, major=None, minor=None, patch=None, tag=None, **unknown_fields):
++        '''
++        build : int
++        major : int
++        minor : int
++        patch : int
++        tag : str
++        '''
++        self.build = build
++        self.major = major
++        self.minor = minor
++        self.patch = patch
++        self.tag = tag
++
++
++
++class Payload(Type):
++    _toSchema = {'class_': 'class', 'id_': 'id', 'labels': 'labels', 'machine': 'machine', 'status': 'status', 'type_': 'type', 'unit': 'unit'}
++    _toPy = {'class': 'class_', 'id': 'id_', 'labels': 'labels', 'machine': 'machine', 'status': 'status', 'type': 'type_', 'unit': 'unit'}
++    def __init__(self, class_=None, id_=None, labels=None, machine=None, status=None, type_=None, unit=None, **unknown_fields):
++        '''
++        class_ : str
++        id_ : str
++        labels : typing.Sequence<+T_co>[str]
++        machine : str
++        status : str
++        type_ : str
++        unit : str
++        '''
++        self.class_ = class_
++        self.id_ = id_
++        self.labels = labels
++        self.machine = machine
++        self.status = status
++        self.type_ = type_
++        self.unit = unit
++
++
++
++class PayloadListArgs(Type):
++    _toSchema = {'patterns': 'patterns'}
++    _toPy = {'patterns': 'patterns'}
++    def __init__(self, patterns=None, **unknown_fields):
++        '''
++        patterns : typing.Sequence<+T_co>[str]
++        '''
++        self.patterns = patterns
++
++
++
++class PayloadListResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~Payload]<~Payload>
++        '''
++        self.results = [Payload.from_json(o) for o in results or []]
++
++
++
++class PayloadResult(Type):
++    _toSchema = {'entity': 'Entity', 'error': 'error', 'not_found': 'not-found', 'payload': 'payload'}
++    _toPy = {'Entity': 'entity', 'error': 'error', 'not-found': 'not_found', 'payload': 'payload'}
++    def __init__(self, entity=None, error=None, not_found=None, payload=None, **unknown_fields):
++        '''
++        entity : Entity
++        error : Error
++        not_found : bool
++        payload : Payload
++        '''
++        self.entity = Entity.from_json(entity) if entity else None
++        self.error = Error.from_json(error) if error else None
++        self.not_found = not_found
++        self.payload = Payload.from_json(payload) if payload else None
++
++
++
++class PayloadResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
++        '''
++        self.results = [PayloadResult.from_json(o) for o in results or []]
++
++
++
++class PhaseResult(Type):
++    _toSchema = {'error': 'error', 'phase': 'phase'}
++    _toPy = {'error': 'error', 'phase': 'phase'}
++    def __init__(self, error=None, phase=None, **unknown_fields):
++        '''
++        error : Error
++        phase : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.phase = phase
++
++
++
++class PhaseResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~PhaseResult]<~PhaseResult>
++        '''
++        self.results = [PhaseResult.from_json(o) for o in results or []]
++
++
++
++class Placement(Type):
++    _toSchema = {'directive': 'directive', 'scope': 'scope'}
++    _toPy = {'directive': 'directive', 'scope': 'scope'}
++    def __init__(self, directive=None, scope=None, **unknown_fields):
++        '''
++        directive : str
++        scope : str
++        '''
++        self.directive = directive
++        self.scope = scope
++
++
++
++class PortRange(Type):
++    _toSchema = {'from_port': 'from-port', 'protocol': 'protocol', 'to_port': 'to-port'}
++    _toPy = {'from-port': 'from_port', 'protocol': 'protocol', 'to-port': 'to_port'}
++    def __init__(self, from_port=None, protocol=None, to_port=None, **unknown_fields):
++        '''
++        from_port : int
++        protocol : str
++        to_port : int
++        '''
++        self.from_port = from_port
++        self.protocol = protocol
++        self.to_port = to_port
++
++
++
++class PrivateAddress(Type):
++    _toSchema = {'target': 'target'}
++    _toPy = {'target': 'target'}
++    def __init__(self, target=None, **unknown_fields):
++        '''
++        target : str
++        '''
++        self.target = target
++
++
++
++class PrivateAddressResults(Type):
++    _toSchema = {'private_address': 'private-address'}
++    _toPy = {'private-address': 'private_address'}
++    def __init__(self, private_address=None, **unknown_fields):
++        '''
++        private_address : str
++        '''
++        self.private_address = private_address
++
++
++
++class ProviderInterfaceInfo(Type):
++    _toSchema = {'interface_name': 'interface-name', 'mac_address': 'mac-address', 'provider_id': 'provider-id'}
++    _toPy = {'interface-name': 'interface_name', 'mac-address': 'mac_address', 'provider-id': 'provider_id'}
++    def __init__(self, interface_name=None, mac_address=None, provider_id=None, **unknown_fields):
++        '''
++        interface_name : str
++        mac_address : str
++        provider_id : str
++        '''
++        self.interface_name = interface_name
++        self.mac_address = mac_address
++        self.provider_id = provider_id
++
++
++
++class ProviderInterfaceInfoResult(Type):
++    _toSchema = {'error': 'error', 'interfaces': 'interfaces', 'machine_tag': 'machine-tag'}
++    _toPy = {'error': 'error', 'interfaces': 'interfaces', 'machine-tag': 'machine_tag'}
++    def __init__(self, error=None, interfaces=None, machine_tag=None, **unknown_fields):
++        '''
++        error : Error
++        interfaces : typing.Sequence<+T_co>[~ProviderInterfaceInfo]<~ProviderInterfaceInfo>
++        machine_tag : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.interfaces = [ProviderInterfaceInfo.from_json(o) for o in interfaces or []]
++        self.machine_tag = machine_tag
++
++
++
++class ProviderInterfaceInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ProviderInterfaceInfoResult]<~ProviderInterfaceInfoResult>
++        '''
++        self.results = [ProviderInterfaceInfoResult.from_json(o) for o in results or []]
++
++
++
++class ProviderSpace(Type):
++    _toSchema = {'error': 'error', 'name': 'name', 'provider_id': 'provider-id', 'subnets': 'subnets'}
++    _toPy = {'error': 'error', 'name': 'name', 'provider-id': 'provider_id', 'subnets': 'subnets'}
++    def __init__(self, error=None, name=None, provider_id=None, subnets=None, **unknown_fields):
++        '''
++        error : Error
++        name : str
++        provider_id : str
++        subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++        self.provider_id = provider_id
++        self.subnets = [Subnet.from_json(o) for o in subnets or []]
++
++
++
++class ProvisioningInfo(Type):
++    _toSchema = {'constraints': 'constraints', 'controller_config': 'controller-config', 'endpoint_bindings': 'endpoint-bindings', 'image_metadata': 'image-metadata', 'jobs': 'jobs', 'placement': 'placement', 'series': 'series', 'subnets_to_zones': 'subnets-to-zones', 'tags': 'tags', 'volumes': 'volumes'}
++    _toPy = {'constraints': 'constraints', 'controller-config': 'controller_config', 'endpoint-bindings': 'endpoint_bindings', 'image-metadata': 'image_metadata', 'jobs': 'jobs', 'placement': 'placement', 'series': 'series', 'subnets-to-zones': 'subnets_to_zones', 'tags': 'tags', 'volumes': 'volumes'}
++    def __init__(self, constraints=None, controller_config=None, endpoint_bindings=None, image_metadata=None, jobs=None, placement=None, series=None, subnets_to_zones=None, tags=None, volumes=None, **unknown_fields):
++        '''
++        constraints : Value
++        controller_config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        endpoint_bindings : typing.Mapping<~KT, +VT_co>[str, str]
++        image_metadata : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata>
++        jobs : typing.Sequence<+T_co>[str]
++        placement : str
++        series : str
++        subnets_to_zones : typing.Sequence<+T_co>[str]
++        tags : typing.Mapping<~KT, +VT_co>[str, str]
++        volumes : typing.Sequence<+T_co>[~VolumeParams]<~VolumeParams>
++        '''
++        self.constraints = Value.from_json(constraints) if constraints else None
++        self.controller_config = controller_config
++        self.endpoint_bindings = endpoint_bindings
++        self.image_metadata = [CloudImageMetadata.from_json(o) for o in image_metadata or []]
++        self.jobs = jobs
++        self.placement = placement
++        self.series = series
++        self.subnets_to_zones = subnets_to_zones
++        self.tags = tags
++        self.volumes = [VolumeParams.from_json(o) for o in volumes or []]
++
++
++
++class ProvisioningInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : ProvisioningInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = ProvisioningInfo.from_json(result) if result else None
++
++
++
++class ProvisioningInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ProvisioningInfoResult]<~ProvisioningInfoResult>
++        '''
++        self.results = [ProvisioningInfoResult.from_json(o) for o in results or []]
++
++
++
++class ProvisioningScriptParams(Type):
++    _toSchema = {'data_dir': 'data-dir', 'disable_package_commands': 'disable-package-commands', 'machine_id': 'machine-id', 'nonce': 'nonce'}
++    _toPy = {'data-dir': 'data_dir', 'disable-package-commands': 'disable_package_commands', 'machine-id': 'machine_id', 'nonce': 'nonce'}
++    def __init__(self, data_dir=None, disable_package_commands=None, machine_id=None, nonce=None, **unknown_fields):
++        '''
++        data_dir : str
++        disable_package_commands : bool
++        machine_id : str
++        nonce : str
++        '''
++        self.data_dir = data_dir
++        self.disable_package_commands = disable_package_commands
++        self.machine_id = machine_id
++        self.nonce = nonce
++
++
++
++class ProvisioningScriptResult(Type):
++    _toSchema = {'script': 'script'}
++    _toPy = {'script': 'script'}
++    def __init__(self, script=None, **unknown_fields):
++        '''
++        script : str
++        '''
++        self.script = script
++
++
++
++class ProxyConfig(Type):
++    _toSchema = {'ftp': 'ftp', 'http': 'http', 'https': 'https', 'no_proxy': 'no-proxy'}
++    _toPy = {'ftp': 'ftp', 'http': 'http', 'https': 'https', 'no-proxy': 'no_proxy'}
++    def __init__(self, ftp=None, http=None, https=None, no_proxy=None, **unknown_fields):
++        '''
++        ftp : str
++        http : str
++        https : str
++        no_proxy : str
++        '''
++        self.ftp = ftp
++        self.http = http
++        self.https = https
++        self.no_proxy = no_proxy
++
++
++
++class ProxyConfigResult(Type):
++    _toSchema = {'apt_proxy_settings': 'apt-proxy-settings', 'error': 'error', 'proxy_settings': 'proxy-settings'}
++    _toPy = {'apt-proxy-settings': 'apt_proxy_settings', 'error': 'error', 'proxy-settings': 'proxy_settings'}
++    def __init__(self, apt_proxy_settings=None, error=None, proxy_settings=None, **unknown_fields):
++        '''
++        apt_proxy_settings : ProxyConfig
++        error : Error
++        proxy_settings : ProxyConfig
++        '''
++        self.apt_proxy_settings = ProxyConfig.from_json(apt_proxy_settings) if apt_proxy_settings else None
++        self.error = Error.from_json(error) if error else None
++        self.proxy_settings = ProxyConfig.from_json(proxy_settings) if proxy_settings else None
++
++
++
++class ProxyConfigResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ProxyConfigResult]<~ProxyConfigResult>
++        '''
++        self.results = [ProxyConfigResult.from_json(o) for o in results or []]
++
++
++
++class PublicAddress(Type):
++    _toSchema = {'target': 'target'}
++    _toPy = {'target': 'target'}
++    def __init__(self, target=None, **unknown_fields):
++        '''
++        target : str
++        '''
++        self.target = target
++
++
++
++class PublicAddressResults(Type):
++    _toSchema = {'public_address': 'public-address'}
++    _toPy = {'public-address': 'public_address'}
++    def __init__(self, public_address=None, **unknown_fields):
++        '''
++        public_address : str
++        '''
++        self.public_address = public_address
++
++
++
++class RebootActionResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class RebootActionResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~RebootActionResult]<~RebootActionResult>
++        '''
++        self.results = [RebootActionResult.from_json(o) for o in results or []]
++
++
++
++class RegionDefaults(Type):
++    _toSchema = {'region_name': 'region-name', 'value': 'value'}
++    _toPy = {'region-name': 'region_name', 'value': 'value'}
++    def __init__(self, region_name=None, value=None, **unknown_fields):
++        '''
++        region_name : str
++        value : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.region_name = region_name
++        self.value = value
++
++
++
++class RelationChange(Type):
++    _toSchema = {'changedunits': 'changedunits', 'departedunits': 'departedunits', 'id_': 'id', 'life': 'life'}
++    _toPy = {'changedunits': 'changedunits', 'departedunits': 'departedunits', 'id': 'id_', 'life': 'life'}
++    def __init__(self, changedunits=None, departedunits=None, id_=None, life=None, **unknown_fields):
++        '''
++        changedunits : typing.Mapping<~KT, +VT_co>[str, ~RelationUnitChange]<~RelationUnitChange>
++        departedunits : typing.Sequence<+T_co>[str]
++        id_ : int
++        life : str
++        '''
++        self.changedunits = changedunits
++        self.departedunits = departedunits
++        self.id_ = id_
++        self.life = life
++
++
++
++class RelationIds(Type):
++    _toSchema = {'relation_ids': 'relation-ids'}
++    _toPy = {'relation-ids': 'relation_ids'}
++    def __init__(self, relation_ids=None, **unknown_fields):
++        '''
++        relation_ids : typing.Sequence<+T_co>[int]
++        '''
++        self.relation_ids = relation_ids
++
++
++
++class RelationResult(Type):
++    _toSchema = {'endpoint': 'endpoint', 'error': 'error', 'id_': 'id', 'key': 'key', 'life': 'life'}
++    _toPy = {'endpoint': 'endpoint', 'error': 'error', 'id': 'id_', 'key': 'key', 'life': 'life'}
++    def __init__(self, endpoint=None, error=None, id_=None, key=None, life=None, **unknown_fields):
++        '''
++        endpoint : Endpoint
++        error : Error
++        id_ : int
++        key : str
++        life : str
++        '''
++        self.endpoint = Endpoint.from_json(endpoint) if endpoint else None
++        self.error = Error.from_json(error) if error else None
++        self.id_ = id_
++        self.key = key
++        self.life = life
++
++
++
++class RelationResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~RelationResult]<~RelationResult>
++        '''
++        self.results = [RelationResult.from_json(o) for o in results or []]
++
++
++
++class RelationStatus(Type):
++    _toSchema = {'endpoints': 'endpoints', 'id_': 'id', 'interface': 'interface', 'key': 'key', 'scope': 'scope'}
++    _toPy = {'endpoints': 'endpoints', 'id': 'id_', 'interface': 'interface', 'key': 'key', 'scope': 'scope'}
++    def __init__(self, endpoints=None, id_=None, interface=None, key=None, scope=None, **unknown_fields):
++        '''
++        endpoints : typing.Sequence<+T_co>[~EndpointStatus]<~EndpointStatus>
++        id_ : int
++        interface : str
++        key : str
++        scope : str
++        '''
++        self.endpoints = [EndpointStatus.from_json(o) for o in endpoints or []]
++        self.id_ = id_
++        self.interface = interface
++        self.key = key
++        self.scope = scope
++
++
++
++class RelationUnit(Type):
++    _toSchema = {'relation': 'relation', 'unit': 'unit'}
++    _toPy = {'relation': 'relation', 'unit': 'unit'}
++    def __init__(self, relation=None, unit=None, **unknown_fields):
++        '''
++        relation : str
++        unit : str
++        '''
++        self.relation = relation
++        self.unit = unit
++
++
++
++class RelationUnitChange(Type):
++    _toSchema = {'settings': 'settings'}
++    _toPy = {'settings': 'settings'}
++    def __init__(self, settings=None, **unknown_fields):
++        '''
++        settings : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        '''
++        self.settings = settings
++
++
++
++class RelationUnitPair(Type):
++    _toSchema = {'local_unit': 'local-unit', 'relation': 'relation', 'remote_unit': 'remote-unit'}
++    _toPy = {'local-unit': 'local_unit', 'relation': 'relation', 'remote-unit': 'remote_unit'}
++    def __init__(self, local_unit=None, relation=None, remote_unit=None, **unknown_fields):
++        '''
++        local_unit : str
++        relation : str
++        remote_unit : str
++        '''
++        self.local_unit = local_unit
++        self.relation = relation
++        self.remote_unit = remote_unit
++
++
++
++class RelationUnitPairs(Type):
++    _toSchema = {'relation_unit_pairs': 'relation-unit-pairs'}
++    _toPy = {'relation-unit-pairs': 'relation_unit_pairs'}
++    def __init__(self, relation_unit_pairs=None, **unknown_fields):
++        '''
++        relation_unit_pairs : typing.Sequence<+T_co>[~RelationUnitPair]<~RelationUnitPair>
++        '''
++        self.relation_unit_pairs = [RelationUnitPair.from_json(o) for o in relation_unit_pairs or []]
++
++
++
++class RelationUnitSettings(Type):
++    _toSchema = {'relation': 'relation', 'settings': 'settings', 'unit': 'unit'}
++    _toPy = {'relation': 'relation', 'settings': 'settings', 'unit': 'unit'}
++    def __init__(self, relation=None, settings=None, unit=None, **unknown_fields):
++        '''
++        relation : str
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        unit : str
++        '''
++        self.relation = relation
++        self.settings = settings
++        self.unit = unit
++
++
++
++class RelationUnits(Type):
++    _toSchema = {'relation_units': 'relation-units'}
++    _toPy = {'relation-units': 'relation_units'}
++    def __init__(self, relation_units=None, **unknown_fields):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit>
++        '''
++        self.relation_units = [RelationUnit.from_json(o) for o in relation_units or []]
++
++
++
++class RelationUnitsChange(Type):
++    _toSchema = {'changed': 'changed', 'departed': 'departed'}
++    _toPy = {'changed': 'changed', 'departed': 'departed'}
++    def __init__(self, changed=None, departed=None, **unknown_fields):
++        '''
++        changed : typing.Mapping<~KT, +VT_co>[str, ~UnitSettings]<~UnitSettings>
++        departed : typing.Sequence<+T_co>[str]
++        '''
++        self.changed = changed
++        self.departed = departed
++
++
++
++class RelationUnitsSettings(Type):
++    _toSchema = {'relation_units': 'relation-units'}
++    _toPy = {'relation-units': 'relation_units'}
++    def __init__(self, relation_units=None, **unknown_fields):
++        '''
++        relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings>
++        '''
++        self.relation_units = [RelationUnitSettings.from_json(o) for o in relation_units or []]
++
++
++
++class RelationUnitsWatchResult(Type):
++    _toSchema = {'changes': 'changes', 'error': 'error', 'watcher_id': 'watcher-id'}
++    _toPy = {'changes': 'changes', 'error': 'error', 'watcher-id': 'watcher_id'}
++    def __init__(self, changes=None, error=None, watcher_id=None, **unknown_fields):
++        '''
++        changes : RelationUnitsChange
++        error : Error
++        watcher_id : str
++        '''
++        self.changes = RelationUnitsChange.from_json(changes) if changes else None
++        self.error = Error.from_json(error) if error else None
++        self.watcher_id = watcher_id
++
++
++
++class RelationUnitsWatchResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult>
++        '''
++        self.results = [RelationUnitsWatchResult.from_json(o) for o in results or []]
++
++
++
++class RemoteApplicationChange(Type):
++    _toSchema = {'application_tag': 'application-tag', 'life': 'life', 'relations': 'relations'}
++    _toPy = {'application-tag': 'application_tag', 'life': 'life', 'relations': 'relations'}
++    def __init__(self, application_tag=None, life=None, relations=None, **unknown_fields):
++        '''
++        application_tag : str
++        life : str
++        relations : RemoteRelationsChange
++        '''
++        self.application_tag = application_tag
++        self.life = life
++        self.relations = RemoteRelationsChange.from_json(relations) if relations else None
++
++
++
++class RemoteApplicationInfo(Type):
++    _toSchema = {'application_url': 'application-url', 'description': 'description', 'endpoints': 'endpoints', 'icon_url_path': 'icon-url-path', 'model_tag': 'model-tag', 'name': 'name', 'source_model_label': 'source-model-label'}
++    _toPy = {'application-url': 'application_url', 'description': 'description', 'endpoints': 'endpoints', 'icon-url-path': 'icon_url_path', 'model-tag': 'model_tag', 'name': 'name', 'source-model-label': 'source_model_label'}
++    def __init__(self, application_url=None, description=None, endpoints=None, icon_url_path=None, model_tag=None, name=None, source_model_label=None, **unknown_fields):
++        '''
++        application_url : str
++        description : str
++        endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint>
++        icon_url_path : str
++        model_tag : str
++        name : str
++        source_model_label : str
++        '''
++        self.application_url = application_url
++        self.description = description
++        self.endpoints = [RemoteEndpoint.from_json(o) for o in endpoints or []]
++        self.icon_url_path = icon_url_path
++        self.model_tag = model_tag
++        self.name = name
++        self.source_model_label = source_model_label
++
++
++
++class RemoteApplicationInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : RemoteApplicationInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = RemoteApplicationInfo.from_json(result) if result else None
++
++
++
++class RemoteApplicationInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~RemoteApplicationInfoResult]<~RemoteApplicationInfoResult>
++        '''
++        self.results = [RemoteApplicationInfoResult.from_json(o) for o in results or []]
++
++
++
++class RemoteApplicationStatus(Type):
++    _toSchema = {'application_name': 'application-name', 'application_url': 'application-url', 'endpoints': 'endpoints', 'err': 'err', 'life': 'life', 'relations': 'relations', 'status': 'status'}
++    _toPy = {'application-name': 'application_name', 'application-url': 'application_url', 'endpoints': 'endpoints', 'err': 'err', 'life': 'life', 'relations': 'relations', 'status': 'status'}
++    def __init__(self, application_name=None, application_url=None, endpoints=None, err=None, life=None, relations=None, status=None, **unknown_fields):
++        '''
++        application_name : str
++        application_url : str
++        endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint>
++        err : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        life : str
++        relations : typing.Sequence<+T_co>[str]
++        status : DetailedStatus
++        '''
++        self.application_name = application_name
++        self.application_url = application_url
++        self.endpoints = [RemoteEndpoint.from_json(o) for o in endpoints or []]
++        self.err = err
++        self.life = life
++        self.relations = relations
++        self.status = DetailedStatus.from_json(status) if status else None
++
++
++
++class RemoteApplicationWatchResult(Type):
++    _toSchema = {'change': 'change', 'error': 'error', 'id_': 'id'}
++    _toPy = {'change': 'change', 'error': 'error', 'id': 'id_'}
++    def __init__(self, change=None, error=None, id_=None, **unknown_fields):
++        '''
++        change : RemoteApplicationChange
++        error : Error
++        id_ : str
++        '''
++        self.change = RemoteApplicationChange.from_json(change) if change else None
++        self.error = Error.from_json(error) if error else None
++        self.id_ = id_
++
++
++
++class RemoteEndpoint(Type):
++    _toSchema = {'interface': 'interface', 'limit': 'limit', 'name': 'name', 'role': 'role', 'scope': 'scope'}
++    _toPy = {'interface': 'interface', 'limit': 'limit', 'name': 'name', 'role': 'role', 'scope': 'scope'}
++    def __init__(self, interface=None, limit=None, name=None, role=None, scope=None, **unknown_fields):
++        '''
++        interface : str
++        limit : int
++        name : str
++        role : str
++        scope : str
++        '''
++        self.interface = interface
++        self.limit = limit
++        self.name = name
++        self.role = role
++        self.scope = scope
++
++
++
++class RemoteEntityId(Type):
++    _toSchema = {'model_uuid': 'model-uuid', 'token': 'token'}
++    _toPy = {'model-uuid': 'model_uuid', 'token': 'token'}
++    def __init__(self, model_uuid=None, token=None, **unknown_fields):
++        '''
++        model_uuid : str
++        token : str
++        '''
++        self.model_uuid = model_uuid
++        self.token = token
++
++
++
++class RemoteRelationChange(Type):
++    _toSchema = {'changed_units': 'changed-units', 'departed_units': 'departed-units', 'id_': 'id', 'life': 'life'}
++    _toPy = {'changed-units': 'changed_units', 'departed-units': 'departed_units', 'id': 'id_', 'life': 'life'}
++    def __init__(self, changed_units=None, departed_units=None, id_=None, life=None, **unknown_fields):
++        '''
++        changed_units : typing.Mapping<~KT, +VT_co>[str, ~RemoteRelationUnitChange]<~RemoteRelationUnitChange>
++        departed_units : typing.Sequence<+T_co>[str]
++        id_ : int
++        life : str
++        '''
++        self.changed_units = changed_units
++        self.departed_units = departed_units
++        self.id_ = id_
++        self.life = life
++
++
++
++class RemoteRelationUnitChange(Type):
++    _toSchema = {'settings': 'settings', 'unit_id': 'unit-id'}
++    _toPy = {'settings': 'settings', 'unit-id': 'unit_id'}
++    def __init__(self, settings=None, unit_id=None, **unknown_fields):
++        '''
++        settings : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        unit_id : RemoteEntityId
++        '''
++        self.settings = settings
++        self.unit_id = RemoteEntityId.from_json(unit_id) if unit_id else None
++
++
++
++class RemoteRelationsChange(Type):
++    _toSchema = {'changed': 'changed', 'initial': 'initial', 'removed': 'removed'}
++    _toPy = {'changed': 'changed', 'initial': 'initial', 'removed': 'removed'}
++    def __init__(self, changed=None, initial=None, removed=None, **unknown_fields):
++        '''
++        changed : typing.Sequence<+T_co>[~RemoteRelationChange]<~RemoteRelationChange>
++        initial : bool
++        removed : typing.Sequence<+T_co>[int]
++        '''
++        self.changed = [RemoteRelationChange.from_json(o) for o in changed or []]
++        self.initial = initial
++        self.removed = removed
++
++
++
++class RemoteRelationsWatchResult(Type):
++    _toSchema = {'change': 'change', 'error': 'error', 'remoterelationswatcherid': 'RemoteRelationsWatcherId'}
++    _toPy = {'RemoteRelationsWatcherId': 'remoterelationswatcherid', 'change': 'change', 'error': 'error'}
++    def __init__(self, remoterelationswatcherid=None, change=None, error=None, **unknown_fields):
++        '''
++        remoterelationswatcherid : str
++        change : RemoteRelationsChange
++        error : Error
++        '''
++        self.remoterelationswatcherid = remoterelationswatcherid
++        self.change = RemoteRelationsChange.from_json(change) if change else None
++        self.error = Error.from_json(error) if error else None
++
++
++
++class RemoteSpace(Type):
++    _toSchema = {'cloud_type': 'cloud-type', 'name': 'name', 'provider_attributes': 'provider-attributes', 'provider_id': 'provider-id', 'subnets': 'subnets'}
++    _toPy = {'cloud-type': 'cloud_type', 'name': 'name', 'provider-attributes': 'provider_attributes', 'provider-id': 'provider_id', 'subnets': 'subnets'}
++    def __init__(self, cloud_type=None, name=None, provider_attributes=None, provider_id=None, subnets=None, **unknown_fields):
++        '''
++        cloud_type : str
++        name : str
++        provider_attributes : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        provider_id : str
++        subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        self.cloud_type = cloud_type
++        self.name = name
++        self.provider_attributes = provider_attributes
++        self.provider_id = provider_id
++        self.subnets = [Subnet.from_json(o) for o in subnets or []]
++
++
++
++class RemoveBlocksArgs(Type):
++    _toSchema = {'all_': 'all'}
++    _toPy = {'all': 'all_'}
++    def __init__(self, all_=None, **unknown_fields):
++        '''
++        all_ : bool
++        '''
++        self.all_ = all_
++
++
++
++class ResolveCharmResult(Type):
++    _toSchema = {'error': 'error', 'url': 'url'}
++    _toPy = {'error': 'error', 'url': 'url'}
++    def __init__(self, error=None, url=None, **unknown_fields):
++        '''
++        error : str
++        url : str
++        '''
++        self.error = error
++        self.url = url
++
++
++
++class ResolveCharmResults(Type):
++    _toSchema = {'urls': 'urls'}
++    _toPy = {'urls': 'urls'}
++    def __init__(self, urls=None, **unknown_fields):
++        '''
++        urls : typing.Sequence<+T_co>[~ResolveCharmResult]<~ResolveCharmResult>
++        '''
++        self.urls = [ResolveCharmResult.from_json(o) for o in urls or []]
++
++
++
++class ResolveCharms(Type):
++    _toSchema = {'references': 'references'}
++    _toPy = {'references': 'references'}
++    def __init__(self, references=None, **unknown_fields):
++        '''
++        references : typing.Sequence<+T_co>[str]
++        '''
++        self.references = references
++
++
++
++class Resolved(Type):
++    _toSchema = {'retry': 'retry', 'unit_name': 'unit-name'}
++    _toPy = {'retry': 'retry', 'unit-name': 'unit_name'}
++    def __init__(self, retry=None, unit_name=None, **unknown_fields):
++        '''
++        retry : bool
++        unit_name : str
++        '''
++        self.retry = retry
++        self.unit_name = unit_name
++
++
++
++class ResolvedModeResult(Type):
++    _toSchema = {'error': 'error', 'mode': 'mode'}
++    _toPy = {'error': 'error', 'mode': 'mode'}
++    def __init__(self, error=None, mode=None, **unknown_fields):
++        '''
++        error : Error
++        mode : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.mode = mode
++
++
++
++class ResolvedModeResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult>
++        '''
++        self.results = [ResolvedModeResult.from_json(o) for o in results or []]
++
++
++
++class Resource(Type):
++    _toSchema = {'application': 'application', 'charmresource': 'CharmResource', 'id_': 'id', 'pending_id': 'pending-id', 'timestamp': 'timestamp', 'username': 'username'}
++    _toPy = {'CharmResource': 'charmresource', 'application': 'application', 'id': 'id_', 'pending-id': 'pending_id', 'timestamp': 'timestamp', 'username': 'username'}
++    def __init__(self, charmresource=None, application=None, id_=None, pending_id=None, timestamp=None, username=None, **unknown_fields):
++        '''
++        charmresource : CharmResource
++        application : str
++        id_ : str
++        pending_id : str
++        timestamp : str
++        username : str
++        '''
++        self.charmresource = CharmResource.from_json(charmresource) if charmresource else None
++        self.application = application
++        self.id_ = id_
++        self.pending_id = pending_id
++        self.timestamp = timestamp
++        self.username = username
++
++
++
++class ResourceResult(Type):
++    _toSchema = {'errorresult': 'ErrorResult', 'resource': 'resource'}
++    _toPy = {'ErrorResult': 'errorresult', 'resource': 'resource'}
++    def __init__(self, errorresult=None, resource=None, **unknown_fields):
++        '''
++        errorresult : ErrorResult
++        resource : Resource
++        '''
++        self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None
++        self.resource = Resource.from_json(resource) if resource else None
++
++
++
++class ResourcesResult(Type):
++    _toSchema = {'charm_store_resources': 'charm-store-resources', 'errorresult': 'ErrorResult', 'resources': 'resources', 'unit_resources': 'unit-resources'}
++    _toPy = {'ErrorResult': 'errorresult', 'charm-store-resources': 'charm_store_resources', 'resources': 'resources', 'unit-resources': 'unit_resources'}
++    def __init__(self, errorresult=None, charm_store_resources=None, resources=None, unit_resources=None, **unknown_fields):
++        '''
++        errorresult : ErrorResult
++        charm_store_resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource>
++        resources : typing.Sequence<+T_co>[~Resource]<~Resource>
++        unit_resources : typing.Sequence<+T_co>[~UnitResources]<~UnitResources>
++        '''
++        self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None
++        self.charm_store_resources = [CharmResource.from_json(o) for o in charm_store_resources or []]
++        self.resources = [Resource.from_json(o) for o in resources or []]
++        self.unit_resources = [UnitResources.from_json(o) for o in unit_resources or []]
++
++
++
++class ResourcesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ResourcesResult]<~ResourcesResult>
++        '''
++        self.results = [ResourcesResult.from_json(o) for o in results or []]
++
++
++
++class RestoreArgs(Type):
++    _toSchema = {'backup_id': 'backup-id'}
++    _toPy = {'backup-id': 'backup_id'}
++    def __init__(self, backup_id=None, **unknown_fields):
++        '''
++        backup_id : str
++        '''
++        self.backup_id = backup_id
++
++
++
++class ResumeReplicationParams(Type):
++    _toSchema = {'members': 'members'}
++    _toPy = {'members': 'members'}
++    def __init__(self, members=None, **unknown_fields):
++        '''
++        members : typing.Sequence<+T_co>[~Member]<~Member>
++        '''
++        self.members = [Member.from_json(o) for o in members or []]
++
++
++
++class RetryStrategy(Type):
++    _toSchema = {'jitter_retry_time': 'jitter-retry-time', 'max_retry_time': 'max-retry-time', 'min_retry_time': 'min-retry-time', 'retry_time_factor': 'retry-time-factor', 'should_retry': 'should-retry'}
++    _toPy = {'jitter-retry-time': 'jitter_retry_time', 'max-retry-time': 'max_retry_time', 'min-retry-time': 'min_retry_time', 'retry-time-factor': 'retry_time_factor', 'should-retry': 'should_retry'}
++    def __init__(self, jitter_retry_time=None, max_retry_time=None, min_retry_time=None, retry_time_factor=None, should_retry=None, **unknown_fields):
++        '''
++        jitter_retry_time : bool
++        max_retry_time : int
++        min_retry_time : int
++        retry_time_factor : int
++        should_retry : bool
++        '''
++        self.jitter_retry_time = jitter_retry_time
++        self.max_retry_time = max_retry_time
++        self.min_retry_time = min_retry_time
++        self.retry_time_factor = retry_time_factor
++        self.should_retry = should_retry
++
++
++
++class RetryStrategyResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : RetryStrategy
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = RetryStrategy.from_json(result) if result else None
++
++
++
++class RetryStrategyResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~RetryStrategyResult]<~RetryStrategyResult>
++        '''
++        self.results = [RetryStrategyResult.from_json(o) for o in results or []]
++
++
++
++class RunParams(Type):
++    _toSchema = {'applications': 'applications', 'commands': 'commands', 'machines': 'machines', 'timeout': 'timeout', 'units': 'units'}
++    _toPy = {'applications': 'applications', 'commands': 'commands', 'machines': 'machines', 'timeout': 'timeout', 'units': 'units'}
++    def __init__(self, applications=None, commands=None, machines=None, timeout=None, units=None, **unknown_fields):
++        '''
++        applications : typing.Sequence<+T_co>[str]
++        commands : str
++        machines : typing.Sequence<+T_co>[str]
++        timeout : int
++        units : typing.Sequence<+T_co>[str]
++        '''
++        self.applications = applications
++        self.commands = commands
++        self.machines = machines
++        self.timeout = timeout
++        self.units = units
++
++
++
++class SSHAddressResult(Type):
++    _toSchema = {'address': 'address', 'error': 'error'}
++    _toPy = {'address': 'address', 'error': 'error'}
++    def __init__(self, address=None, error=None, **unknown_fields):
++        '''
++        address : str
++        error : Error
++        '''
++        self.address = address
++        self.error = Error.from_json(error) if error else None
++
++
++
++class SSHAddressResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult>
++        '''
++        self.results = [SSHAddressResult.from_json(o) for o in results or []]
++
++
++
++class SSHAddressesResult(Type):
++    _toSchema = {'addresses': 'addresses', 'error': 'error'}
++    _toPy = {'addresses': 'addresses', 'error': 'error'}
++    def __init__(self, addresses=None, error=None, **unknown_fields):
++        '''
++        addresses : typing.Sequence<+T_co>[str]
++        error : Error
++        '''
++        self.addresses = addresses
++        self.error = Error.from_json(error) if error else None
++
++
++
++class SSHAddressesResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~SSHAddressesResult]<~SSHAddressesResult>
++        '''
++        self.results = [SSHAddressesResult.from_json(o) for o in results or []]
++
++
++
++class SSHHostKeySet(Type):
++    _toSchema = {'entity_keys': 'entity-keys'}
++    _toPy = {'entity-keys': 'entity_keys'}
++    def __init__(self, entity_keys=None, **unknown_fields):
++        '''
++        entity_keys : typing.Sequence<+T_co>[~SSHHostKeys]<~SSHHostKeys>
++        '''
++        self.entity_keys = [SSHHostKeys.from_json(o) for o in entity_keys or []]
++
++
++
++class SSHHostKeys(Type):
++    _toSchema = {'public_keys': 'public-keys', 'tag': 'tag'}
++    _toPy = {'public-keys': 'public_keys', 'tag': 'tag'}
++    def __init__(self, public_keys=None, tag=None, **unknown_fields):
++        '''
++        public_keys : typing.Sequence<+T_co>[str]
++        tag : str
++        '''
++        self.public_keys = public_keys
++        self.tag = tag
++
++
++
++class SSHProxyResult(Type):
++    _toSchema = {'use_proxy': 'use-proxy'}
++    _toPy = {'use-proxy': 'use_proxy'}
++    def __init__(self, use_proxy=None, **unknown_fields):
++        '''
++        use_proxy : bool
++        '''
++        self.use_proxy = use_proxy
++
++
++
++class SSHPublicKeysResult(Type):
++    _toSchema = {'error': 'error', 'public_keys': 'public-keys'}
++    _toPy = {'error': 'error', 'public-keys': 'public_keys'}
++    def __init__(self, error=None, public_keys=None, **unknown_fields):
++        '''
++        error : Error
++        public_keys : typing.Sequence<+T_co>[str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.public_keys = public_keys
++
++
++
++class SSHPublicKeysResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult>
++        '''
++        self.results = [SSHPublicKeysResult.from_json(o) for o in results or []]
++
++
++
++class SerializedModel(Type):
++    _toSchema = {'bytes_': 'bytes', 'charms': 'charms', 'tools': 'tools'}
++    _toPy = {'bytes': 'bytes_', 'charms': 'charms', 'tools': 'tools'}
++    def __init__(self, bytes_=None, charms=None, tools=None, **unknown_fields):
++        '''
++        bytes_ : typing.Sequence<+T_co>[int]
++        charms : typing.Sequence<+T_co>[str]
++        tools : typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools>
++        '''
++        self.bytes_ = bytes_
++        self.charms = charms
++        self.tools = [SerializedModelTools.from_json(o) for o in tools or []]
++
++
++
++class SerializedModelResource(Type):
++    _toSchema = {'application': 'application', 'application_revision': 'application-revision', 'charmstore_revision': 'charmstore-revision', 'name': 'name', 'unit_revisions': 'unit-revisions'}
++    _toPy = {'application': 'application', 'application-revision': 'application_revision', 'charmstore-revision': 'charmstore_revision', 'name': 'name', 'unit-revisions': 'unit_revisions'}
++    def __init__(self, application=None, application_revision=None, charmstore_revision=None, name=None, unit_revisions=None, **unknown_fields):
++        '''
++        application : str
++        application_revision : SerializedModelResourceRevision
++        charmstore_revision : SerializedModelResourceRevision
++        name : str
++        unit_revisions : typing.Mapping<~KT, +VT_co>[str, ~SerializedModelResourceRevision]<~SerializedModelResourceRevision>
++        '''
++        self.application = application
++        self.application_revision = SerializedModelResourceRevision.from_json(application_revision) if application_revision else None
++        self.charmstore_revision = SerializedModelResourceRevision.from_json(charmstore_revision) if charmstore_revision else None
++        self.name = name
++        self.unit_revisions = unit_revisions
++
++
++
++class SerializedModelResourceRevision(Type):
++    _toSchema = {'description': 'description', 'fingerprint': 'fingerprint', 'origin': 'origin', 'path': 'path', 'revision': 'revision', 'size': 'size', 'timestamp': 'timestamp', 'type_': 'type', 'username': 'username'}
++    _toPy = {'description': 'description', 'fingerprint': 'fingerprint', 'origin': 'origin', 'path': 'path', 'revision': 'revision', 'size': 'size', 'timestamp': 'timestamp', 'type': 'type_', 'username': 'username'}
++    def __init__(self, description=None, fingerprint=None, origin=None, path=None, revision=None, size=None, timestamp=None, type_=None, username=None, **unknown_fields):
++        '''
++        description : str
++        fingerprint : str
++        origin : str
++        path : str
++        revision : int
++        size : int
++        timestamp : str
++        type_ : str
++        username : str
++        '''
++        self.description = description
++        self.fingerprint = fingerprint
++        self.origin = origin
++        self.path = path
++        self.revision = revision
++        self.size = size
++        self.timestamp = timestamp
++        self.type_ = type_
++        self.username = username
++
++
++
++class SerializedModelTools(Type):
++    _toSchema = {'uri': 'uri', 'version': 'version'}
++    _toPy = {'uri': 'uri', 'version': 'version'}
++    def __init__(self, uri=None, version=None, **unknown_fields):
++        '''
++        uri : str
++        version : str
++        '''
++        self.uri = uri
++        self.version = version
++
++
++
++class SetConstraints(Type):
++    _toSchema = {'application': 'application', 'constraints': 'constraints'}
++    _toPy = {'application': 'application', 'constraints': 'constraints'}
++    def __init__(self, application=None, constraints=None, **unknown_fields):
++        '''
++        application : str
++        constraints : Value
++        '''
++        self.application = application
++        self.constraints = Value.from_json(constraints) if constraints else None
++
++
++
++class SetMachineBlockDevices(Type):
++    _toSchema = {'machine_block_devices': 'machine-block-devices'}
++    _toPy = {'machine-block-devices': 'machine_block_devices'}
++    def __init__(self, machine_block_devices=None, **unknown_fields):
++        '''
++        machine_block_devices : typing.Sequence<+T_co>[~MachineBlockDevices]<~MachineBlockDevices>
++        '''
++        self.machine_block_devices = [MachineBlockDevices.from_json(o) for o in machine_block_devices or []]
++
++
++
++class SetMachineNetworkConfig(Type):
++    _toSchema = {'config': 'config', 'tag': 'tag'}
++    _toPy = {'config': 'config', 'tag': 'tag'}
++    def __init__(self, config=None, tag=None, **unknown_fields):
++        '''
++        config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        tag : str
++        '''
++        self.config = [NetworkConfig.from_json(o) for o in config or []]
++        self.tag = tag
++
++
++
++class SetMachinesAddresses(Type):
++    _toSchema = {'machine_addresses': 'machine-addresses'}
++    _toPy = {'machine-addresses': 'machine_addresses'}
++    def __init__(self, machine_addresses=None, **unknown_fields):
++        '''
++        machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses>
++        '''
++        self.machine_addresses = [MachineAddresses.from_json(o) for o in machine_addresses or []]
++
++
++
++class SetMigrationPhaseArgs(Type):
++    _toSchema = {'phase': 'phase'}
++    _toPy = {'phase': 'phase'}
++    def __init__(self, phase=None, **unknown_fields):
++        '''
++        phase : str
++        '''
++        self.phase = phase
++
++
++
++class SetMigrationStatusMessageArgs(Type):
++    _toSchema = {'message': 'message'}
++    _toPy = {'message': 'message'}
++    def __init__(self, message=None, **unknown_fields):
++        '''
++        message : str
++        '''
++        self.message = message
++
++
++
++class SetModelAgentVersion(Type):
++    _toSchema = {'version': 'version'}
++    _toPy = {'version': 'version'}
++    def __init__(self, version=None, **unknown_fields):
++        '''
++        version : Number
++        '''
++        self.version = Number.from_json(version) if version else None
++
++
++
++class SetModelDefaults(Type):
++    _toSchema = {'config': 'config'}
++    _toPy = {'config': 'config'}
++    def __init__(self, config=None, **unknown_fields):
++        '''
++        config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues>
++        '''
++        self.config = [ModelDefaultValues.from_json(o) for o in config or []]
++
++
++
++class SetPayloadStatusArg(Type):
++    _toSchema = {'entity': 'Entity', 'status': 'status'}
++    _toPy = {'Entity': 'entity', 'status': 'status'}
++    def __init__(self, entity=None, status=None, **unknown_fields):
++        '''
++        entity : Entity
++        status : str
++        '''
++        self.entity = Entity.from_json(entity) if entity else None
++        self.status = status
++
++
++
++class SetPayloadStatusArgs(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~SetPayloadStatusArg]<~SetPayloadStatusArg>
++        '''
++        self.args = [SetPayloadStatusArg.from_json(o) for o in args or []]
++
++
++
++class SetStatus(Type):
++    _toSchema = {'entities': 'entities'}
++    _toPy = {'entities': 'entities'}
++    def __init__(self, entities=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
++        '''
++        self.entities = [EntityStatusArgs.from_json(o) for o in entities or []]
++
++
++
++class SetStatusArg(Type):
++    _toSchema = {'entity': 'Entity', 'status': 'status'}
++    _toPy = {'Entity': 'entity', 'status': 'status'}
++    def __init__(self, entity=None, status=None, **unknown_fields):
++        '''
++        entity : Entity
++        status : str
++        '''
++        self.entity = Entity.from_json(entity) if entity else None
++        self.status = status
++
++
++
++class SetStatusArgs(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~SetStatusArg]<~SetStatusArg>
++        '''
++        self.args = [SetStatusArg.from_json(o) for o in args or []]
++
++
++
++class Settings(Type):
++    _toSchema = {'ftp': 'Ftp', 'http': 'Http', 'https': 'Https', 'noproxy': 'NoProxy'}
++    _toPy = {'Ftp': 'ftp', 'Http': 'http', 'Https': 'https', 'NoProxy': 'noproxy'}
++    def __init__(self, ftp=None, http=None, https=None, noproxy=None, **unknown_fields):
++        '''
++        ftp : str
++        http : str
++        https : str
++        noproxy : str
++        '''
++        self.ftp = ftp
++        self.http = http
++        self.https = https
++        self.noproxy = noproxy
++
++
++
++class SettingsResult(Type):
++    _toSchema = {'error': 'error', 'settings': 'settings'}
++    _toPy = {'error': 'error', 'settings': 'settings'}
++    def __init__(self, error=None, settings=None, **unknown_fields):
++        '''
++        error : Error
++        settings : typing.Mapping<~KT, +VT_co>[str, str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.settings = settings
++
++
++
++class SettingsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult>
++        '''
++        self.results = [SettingsResult.from_json(o) for o in results or []]
++
++
++
++class SingularClaim(Type):
++    _toSchema = {'controller_tag': 'controller-tag', 'duration': 'duration', 'model_tag': 'model-tag'}
++    _toPy = {'controller-tag': 'controller_tag', 'duration': 'duration', 'model-tag': 'model_tag'}
++    def __init__(self, controller_tag=None, duration=None, model_tag=None, **unknown_fields):
++        '''
++        controller_tag : str
++        duration : int
++        model_tag : str
++        '''
++        self.controller_tag = controller_tag
++        self.duration = duration
++        self.model_tag = model_tag
++
++
++
++class SingularClaims(Type):
++    _toSchema = {'claims': 'claims'}
++    _toPy = {'claims': 'claims'}
++    def __init__(self, claims=None, **unknown_fields):
++        '''
++        claims : typing.Sequence<+T_co>[~SingularClaim]<~SingularClaim>
++        '''
++        self.claims = [SingularClaim.from_json(o) for o in claims or []]
++
++
++
++class Space(Type):
++    _toSchema = {'error': 'error', 'name': 'name', 'subnets': 'subnets'}
++    _toPy = {'error': 'error', 'name': 'name', 'subnets': 'subnets'}
++    def __init__(self, error=None, name=None, subnets=None, **unknown_fields):
++        '''
++        error : Error
++        name : str
++        subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++        self.subnets = [Subnet.from_json(o) for o in subnets or []]
++
++
++
++class SpaceResult(Type):
++    _toSchema = {'error': 'error', 'tag': 'tag'}
++    _toPy = {'error': 'error', 'tag': 'tag'}
++    def __init__(self, error=None, tag=None, **unknown_fields):
++        '''
++        error : Error
++        tag : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.tag = tag
++
++
++
++class SpaceResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~SpaceResult]<~SpaceResult>
++        '''
++        self.results = [SpaceResult.from_json(o) for o in results or []]
++
++
++
++class StateServingInfo(Type):
++    _toSchema = {'api_port': 'api-port', 'ca_private_key': 'ca-private-key', 'cert': 'cert', 'private_key': 'private-key', 'shared_secret': 'shared-secret', 'state_port': 'state-port', 'system_identity': 'system-identity'}
++    _toPy = {'api-port': 'api_port', 'ca-private-key': 'ca_private_key', 'cert': 'cert', 'private-key': 'private_key', 'shared-secret': 'shared_secret', 'state-port': 'state_port', 'system-identity': 'system_identity'}
++    def __init__(self, api_port=None, ca_private_key=None, cert=None, private_key=None, shared_secret=None, state_port=None, system_identity=None, **unknown_fields):
++        '''
++        api_port : int
++        ca_private_key : str
++        cert : str
++        private_key : str
++        shared_secret : str
++        state_port : int
++        system_identity : str
++        '''
++        self.api_port = api_port
++        self.ca_private_key = ca_private_key
++        self.cert = cert
++        self.private_key = private_key
++        self.shared_secret = shared_secret
++        self.state_port = state_port
++        self.system_identity = system_identity
++
++
++
++class StatusHistoryFilter(Type):
++    _toSchema = {'date': 'date', 'delta': 'delta', 'size': 'size'}
++    _toPy = {'date': 'date', 'delta': 'delta', 'size': 'size'}
++    def __init__(self, date=None, delta=None, size=None, **unknown_fields):
++        '''
++        date : str
++        delta : int
++        size : int
++        '''
++        self.date = date
++        self.delta = delta
++        self.size = size
++
++
++
++class StatusHistoryPruneArgs(Type):
++    _toSchema = {'max_history_mb': 'max-history-mb', 'max_history_time': 'max-history-time'}
++    _toPy = {'max-history-mb': 'max_history_mb', 'max-history-time': 'max_history_time'}
++    def __init__(self, max_history_mb=None, max_history_time=None, **unknown_fields):
++        '''
++        max_history_mb : int
++        max_history_time : int
++        '''
++        self.max_history_mb = max_history_mb
++        self.max_history_time = max_history_time
++
++
++
++class StatusHistoryRequest(Type):
++    _toSchema = {'filter_': 'filter', 'historykind': 'historyKind', 'size': 'size', 'tag': 'tag'}
++    _toPy = {'filter': 'filter_', 'historyKind': 'historykind', 'size': 'size', 'tag': 'tag'}
++    def __init__(self, filter_=None, historykind=None, size=None, tag=None, **unknown_fields):
++        '''
++        filter_ : StatusHistoryFilter
++        historykind : str
++        size : int
++        tag : str
++        '''
++        self.filter_ = StatusHistoryFilter.from_json(filter_) if filter_ else None
++        self.historykind = historykind
++        self.size = size
++        self.tag = tag
++
++
++
++class StatusHistoryRequests(Type):
++    _toSchema = {'requests': 'requests'}
++    _toPy = {'requests': 'requests'}
++    def __init__(self, requests=None, **unknown_fields):
++        '''
++        requests : typing.Sequence<+T_co>[~StatusHistoryRequest]<~StatusHistoryRequest>
++        '''
++        self.requests = [StatusHistoryRequest.from_json(o) for o in requests or []]
++
++
++
++class StatusHistoryResult(Type):
++    _toSchema = {'error': 'error', 'history': 'history'}
++    _toPy = {'error': 'error', 'history': 'history'}
++    def __init__(self, error=None, history=None, **unknown_fields):
++        '''
++        error : Error
++        history : History
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.history = History.from_json(history) if history else None
++
++
++
++class StatusHistoryResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StatusHistoryResult]<~StatusHistoryResult>
++        '''
++        self.results = [StatusHistoryResult.from_json(o) for o in results or []]
++
++
++
++class StatusParams(Type):
++    _toSchema = {'patterns': 'patterns'}
++    _toPy = {'patterns': 'patterns'}
++    def __init__(self, patterns=None, **unknown_fields):
++        '''
++        patterns : typing.Sequence<+T_co>[str]
++        '''
++        self.patterns = patterns
++
++
++
++class StatusResult(Type):
++    _toSchema = {'data': 'data', 'error': 'error', 'id_': 'id', 'info': 'info', 'life': 'life', 'since': 'since', 'status': 'status'}
++    _toPy = {'data': 'data', 'error': 'error', 'id': 'id_', 'info': 'info', 'life': 'life', 'since': 'since', 'status': 'status'}
++    def __init__(self, data=None, error=None, id_=None, info=None, life=None, since=None, status=None, **unknown_fields):
++        '''
++        data : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        error : Error
++        id_ : str
++        info : str
++        life : str
++        since : str
++        status : str
++        '''
++        self.data = data
++        self.error = Error.from_json(error) if error else None
++        self.id_ = id_
++        self.info = info
++        self.life = life
++        self.since = since
++        self.status = status
++
++
++
++class StatusResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StatusResult]<~StatusResult>
++        '''
++        self.results = [StatusResult.from_json(o) for o in results or []]
++
++
++
++class StorageAddParams(Type):
++    _toSchema = {'name': 'name', 'storage': 'storage', 'unit': 'unit'}
++    _toPy = {'name': 'name', 'storage': 'storage', 'unit': 'unit'}
++    def __init__(self, name=None, storage=None, unit=None, **unknown_fields):
++        '''
++        name : str
++        storage : StorageConstraints
++        unit : str
++        '''
++        self.name = name
++        self.storage = StorageConstraints.from_json(storage) if storage else None
++        self.unit = unit
++
++
++
++class StorageAttachment(Type):
++    _toSchema = {'kind': 'kind', 'life': 'life', 'location': 'location', 'owner_tag': 'owner-tag', 'storage_tag': 'storage-tag', 'unit_tag': 'unit-tag'}
++    _toPy = {'kind': 'kind', 'life': 'life', 'location': 'location', 'owner-tag': 'owner_tag', 'storage-tag': 'storage_tag', 'unit-tag': 'unit_tag'}
++    def __init__(self, kind=None, life=None, location=None, owner_tag=None, storage_tag=None, unit_tag=None, **unknown_fields):
++        '''
++        kind : int
++        life : str
++        location : str
++        owner_tag : str
++        storage_tag : str
++        unit_tag : str
++        '''
++        self.kind = kind
++        self.life = life
++        self.location = location
++        self.owner_tag = owner_tag
++        self.storage_tag = storage_tag
++        self.unit_tag = unit_tag
++
++
++
++class StorageAttachmentDetails(Type):
++    _toSchema = {'location': 'location', 'machine_tag': 'machine-tag', 'storage_tag': 'storage-tag', 'unit_tag': 'unit-tag'}
++    _toPy = {'location': 'location', 'machine-tag': 'machine_tag', 'storage-tag': 'storage_tag', 'unit-tag': 'unit_tag'}
++    def __init__(self, location=None, machine_tag=None, storage_tag=None, unit_tag=None, **unknown_fields):
++        '''
++        location : str
++        machine_tag : str
++        storage_tag : str
++        unit_tag : str
++        '''
++        self.location = location
++        self.machine_tag = machine_tag
++        self.storage_tag = storage_tag
++        self.unit_tag = unit_tag
++
++
++
++class StorageAttachmentId(Type):
++    _toSchema = {'storage_tag': 'storage-tag', 'unit_tag': 'unit-tag'}
++    _toPy = {'storage-tag': 'storage_tag', 'unit-tag': 'unit_tag'}
++    def __init__(self, storage_tag=None, unit_tag=None, **unknown_fields):
++        '''
++        storage_tag : str
++        unit_tag : str
++        '''
++        self.storage_tag = storage_tag
++        self.unit_tag = unit_tag
++
++
++
++class StorageAttachmentIds(Type):
++    _toSchema = {'ids': 'ids'}
++    _toPy = {'ids': 'ids'}
++    def __init__(self, ids=None, **unknown_fields):
++        '''
++        ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId>
++        '''
++        self.ids = [StorageAttachmentId.from_json(o) for o in ids or []]
++
++
++
++class StorageAttachmentIdsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : StorageAttachmentIds
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = StorageAttachmentIds.from_json(result) if result else None
++
++
++
++class StorageAttachmentIdsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult>
++        '''
++        self.results = [StorageAttachmentIdsResult.from_json(o) for o in results or []]
++
++
++
++class StorageAttachmentResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : StorageAttachment
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = StorageAttachment.from_json(result) if result else None
++
++
++
++class StorageAttachmentResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult>
++        '''
++        self.results = [StorageAttachmentResult.from_json(o) for o in results or []]
++
++
++
++class StorageConstraints(Type):
++    _toSchema = {'count': 'count', 'pool': 'pool', 'size': 'size'}
++    _toPy = {'count': 'count', 'pool': 'pool', 'size': 'size'}
++    def __init__(self, count=None, pool=None, size=None, **unknown_fields):
++        '''
++        count : int
++        pool : str
++        size : int
++        '''
++        self.count = count
++        self.pool = pool
++        self.size = size
++
++
++
++class StorageDetails(Type):
++    _toSchema = {'attachments': 'attachments', 'kind': 'kind', 'owner_tag': 'owner-tag', 'persistent': 'persistent', 'status': 'status', 'storage_tag': 'storage-tag'}
++    _toPy = {'attachments': 'attachments', 'kind': 'kind', 'owner-tag': 'owner_tag', 'persistent': 'persistent', 'status': 'status', 'storage-tag': 'storage_tag'}
++    def __init__(self, attachments=None, kind=None, owner_tag=None, persistent=None, status=None, storage_tag=None, **unknown_fields):
++        '''
++        attachments : typing.Mapping<~KT, +VT_co>[str, ~StorageAttachmentDetails]<~StorageAttachmentDetails>
++        kind : int
++        owner_tag : str
++        persistent : bool
++        status : EntityStatus
++        storage_tag : str
++        '''
++        self.attachments = attachments
++        self.kind = kind
++        self.owner_tag = owner_tag
++        self.persistent = persistent
++        self.status = EntityStatus.from_json(status) if status else None
++        self.storage_tag = storage_tag
++
++
++
++class StorageDetailsListResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Sequence<+T_co>[~StorageDetails]<~StorageDetails>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = [StorageDetails.from_json(o) for o in result or []]
++
++
++
++class StorageDetailsListResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StorageDetailsListResult]<~StorageDetailsListResult>
++        '''
++        self.results = [StorageDetailsListResult.from_json(o) for o in results or []]
++
++
++
++class StorageDetailsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : StorageDetails
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = StorageDetails.from_json(result) if result else None
++
++
++
++class StorageDetailsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StorageDetailsResult]<~StorageDetailsResult>
++        '''
++        self.results = [StorageDetailsResult.from_json(o) for o in results or []]
++
++
++
++class StorageFilter(Type):
++    _toSchema = {}
++    _toPy = {}
++    def __init__(self, **unknown_fields):
++        '''
++
++        '''
++        pass
++
++
++
++class StorageFilters(Type):
++    _toSchema = {'filters': 'filters'}
++    _toPy = {'filters': 'filters'}
++    def __init__(self, filters=None, **unknown_fields):
++        '''
++        filters : typing.Sequence<+T_co>[~StorageFilter]<~StorageFilter>
++        '''
++        self.filters = [StorageFilter.from_json(o) for o in filters or []]
++
++
++
++class StoragePool(Type):
++    _toSchema = {'attrs': 'attrs', 'name': 'name', 'provider': 'provider'}
++    _toPy = {'attrs': 'attrs', 'name': 'name', 'provider': 'provider'}
++    def __init__(self, attrs=None, name=None, provider=None, **unknown_fields):
++        '''
++        attrs : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        name : str
++        provider : str
++        '''
++        self.attrs = attrs
++        self.name = name
++        self.provider = provider
++
++
++
++class StoragePoolFilter(Type):
++    _toSchema = {'names': 'names', 'providers': 'providers'}
++    _toPy = {'names': 'names', 'providers': 'providers'}
++    def __init__(self, names=None, providers=None, **unknown_fields):
++        '''
++        names : typing.Sequence<+T_co>[str]
++        providers : typing.Sequence<+T_co>[str]
++        '''
++        self.names = names
++        self.providers = providers
++
++
++
++class StoragePoolFilters(Type):
++    _toSchema = {'filters': 'filters'}
++    _toPy = {'filters': 'filters'}
++    def __init__(self, filters=None, **unknown_fields):
++        '''
++        filters : typing.Sequence<+T_co>[~StoragePoolFilter]<~StoragePoolFilter>
++        '''
++        self.filters = [StoragePoolFilter.from_json(o) for o in filters or []]
++
++
++
++class StoragePoolsResult(Type):
++    _toSchema = {'error': 'error', 'storage_pools': 'storage-pools'}
++    _toPy = {'error': 'error', 'storage-pools': 'storage_pools'}
++    def __init__(self, error=None, storage_pools=None, **unknown_fields):
++        '''
++        error : Error
++        storage_pools : typing.Sequence<+T_co>[~StoragePool]<~StoragePool>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.storage_pools = [StoragePool.from_json(o) for o in storage_pools or []]
++
++
++
++class StoragePoolsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StoragePoolsResult]<~StoragePoolsResult>
++        '''
++        self.results = [StoragePoolsResult.from_json(o) for o in results or []]
++
++
++
++class StoragesAddParams(Type):
++    _toSchema = {'storages': 'storages'}
++    _toPy = {'storages': 'storages'}
++    def __init__(self, storages=None, **unknown_fields):
++        '''
++        storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams>
++        '''
++        self.storages = [StorageAddParams.from_json(o) for o in storages or []]
++
++
++
++class StringBoolResult(Type):
++    _toSchema = {'error': 'error', 'ok': 'ok', 'result': 'result'}
++    _toPy = {'error': 'error', 'ok': 'ok', 'result': 'result'}
++    def __init__(self, error=None, ok=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        ok : bool
++        result : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.ok = ok
++        self.result = result
++
++
++
++class StringBoolResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult>
++        '''
++        self.results = [StringBoolResult.from_json(o) for o in results or []]
++
++
++
++class StringResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : str
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class StringResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StringResult]<~StringResult>
++        '''
++        self.results = [StringResult.from_json(o) for o in results or []]
++
++
++
++class StringsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Sequence<+T_co>[str]
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = result
++
++
++
++class StringsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
++        '''
++        self.results = [StringsResult.from_json(o) for o in results or []]
++
++
++
++class StringsWatchResult(Type):
++    _toSchema = {'changes': 'changes', 'error': 'error', 'watcher_id': 'watcher-id'}
++    _toPy = {'changes': 'changes', 'error': 'error', 'watcher-id': 'watcher_id'}
++    def __init__(self, changes=None, error=None, watcher_id=None, **unknown_fields):
++        '''
++        changes : typing.Sequence<+T_co>[str]
++        error : Error
++        watcher_id : str
++        '''
++        self.changes = changes
++        self.error = Error.from_json(error) if error else None
++        self.watcher_id = watcher_id
++
++
++
++class StringsWatchResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult>
++        '''
++        self.results = [StringsWatchResult.from_json(o) for o in results or []]
++
++
++
++class Subnet(Type):
++    _toSchema = {'cidr': 'cidr', 'life': 'life', 'provider_id': 'provider-id', 'space_tag': 'space-tag', 'status': 'status', 'vlan_tag': 'vlan-tag', 'zones': 'zones'}
++    _toPy = {'cidr': 'cidr', 'life': 'life', 'provider-id': 'provider_id', 'space-tag': 'space_tag', 'status': 'status', 'vlan-tag': 'vlan_tag', 'zones': 'zones'}
++    def __init__(self, cidr=None, life=None, provider_id=None, space_tag=None, status=None, vlan_tag=None, zones=None, **unknown_fields):
++        '''
++        cidr : str
++        life : str
++        provider_id : str
++        space_tag : str
++        status : str
++        vlan_tag : int
++        zones : typing.Sequence<+T_co>[str]
++        '''
++        self.cidr = cidr
++        self.life = life
++        self.provider_id = provider_id
++        self.space_tag = space_tag
++        self.status = status
++        self.vlan_tag = vlan_tag
++        self.zones = zones
++
++
++
++class SubnetsFilters(Type):
++    _toSchema = {'space_tag': 'space-tag', 'zone': 'zone'}
++    _toPy = {'space-tag': 'space_tag', 'zone': 'zone'}
++    def __init__(self, space_tag=None, zone=None, **unknown_fields):
++        '''
++        space_tag : str
++        zone : str
++        '''
++        self.space_tag = space_tag
++        self.zone = zone
++
++
++
++class Tools(Type):
++    _toSchema = {'sha256': 'sha256', 'size': 'size', 'url': 'url', 'version': 'version'}
++    _toPy = {'sha256': 'sha256', 'size': 'size', 'url': 'url', 'version': 'version'}
++    def __init__(self, sha256=None, size=None, url=None, version=None, **unknown_fields):
++        '''
++        sha256 : str
++        size : int
++        url : str
++        version : Binary
++        '''
++        self.sha256 = sha256
++        self.size = size
++        self.url = url
++        self.version = Binary.from_json(version) if version else None
++
++
++
++class ToolsResult(Type):
++    _toSchema = {'disable_ssl_hostname_verification': 'disable-ssl-hostname-verification', 'error': 'error', 'tools': 'tools'}
++    _toPy = {'disable-ssl-hostname-verification': 'disable_ssl_hostname_verification', 'error': 'error', 'tools': 'tools'}
++    def __init__(self, disable_ssl_hostname_verification=None, error=None, tools=None, **unknown_fields):
++        '''
++        disable_ssl_hostname_verification : bool
++        error : Error
++        tools : typing.Sequence<+T_co>[~Tools]<~Tools>
++        '''
++        self.disable_ssl_hostname_verification = disable_ssl_hostname_verification
++        self.error = Error.from_json(error) if error else None
++        self.tools = [Tools.from_json(o) for o in tools or []]
++
++
++
++class ToolsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult>
++        '''
++        self.results = [ToolsResult.from_json(o) for o in results or []]
++
++
++
++class TrackArgs(Type):
++    _toSchema = {'payloads': 'payloads'}
++    _toPy = {'payloads': 'payloads'}
++    def __init__(self, payloads=None, **unknown_fields):
++        '''
++        payloads : typing.Sequence<+T_co>[~Payload]<~Payload>
++        '''
++        self.payloads = [Payload.from_json(o) for o in payloads or []]
++
++
++
++class TrackPayloadArgs(Type):
++    _toSchema = {'payloads': 'payloads'}
++    _toPy = {'payloads': 'payloads'}
++    def __init__(self, payloads=None, **unknown_fields):
++        '''
++        payloads : typing.Sequence<+T_co>[~Payload]<~Payload>
++        '''
++        self.payloads = [Payload.from_json(o) for o in payloads or []]
++
++
++
++class UndertakerModelInfo(Type):
++    _toSchema = {'global_name': 'global-name', 'is_system': 'is-system', 'life': 'life', 'name': 'name', 'uuid': 'uuid'}
++    _toPy = {'global-name': 'global_name', 'is-system': 'is_system', 'life': 'life', 'name': 'name', 'uuid': 'uuid'}
++    def __init__(self, global_name=None, is_system=None, life=None, name=None, uuid=None, **unknown_fields):
++        '''
++        global_name : str
++        is_system : bool
++        life : str
++        name : str
++        uuid : str
++        '''
++        self.global_name = global_name
++        self.is_system = is_system
++        self.life = life
++        self.name = name
++        self.uuid = uuid
++
++
++
++class UndertakerModelInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : UndertakerModelInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = UndertakerModelInfo.from_json(result) if result else None
++
++
++
++class UnitNetworkConfig(Type):
++    _toSchema = {'binding_name': 'binding-name', 'unit_tag': 'unit-tag'}
++    _toPy = {'binding-name': 'binding_name', 'unit-tag': 'unit_tag'}
++    def __init__(self, binding_name=None, unit_tag=None, **unknown_fields):
++        '''
++        binding_name : str
++        unit_tag : str
++        '''
++        self.binding_name = binding_name
++        self.unit_tag = unit_tag
++
++
++
++class UnitNetworkConfigResult(Type):
++    _toSchema = {'error': 'error', 'info': 'info'}
++    _toPy = {'error': 'error', 'info': 'info'}
++    def __init__(self, error=None, info=None, **unknown_fields):
++        '''
++        error : Error
++        info : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.info = [NetworkConfig.from_json(o) for o in info or []]
++
++
++
++class UnitNetworkConfigResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~UnitNetworkConfigResult]<~UnitNetworkConfigResult>
++        '''
++        self.results = [UnitNetworkConfigResult.from_json(o) for o in results or []]
++
++
++
++class UnitResourceResult(Type):
++    _toSchema = {'errorresult': 'ErrorResult', 'resource': 'resource'}
++    _toPy = {'ErrorResult': 'errorresult', 'resource': 'resource'}
++    def __init__(self, errorresult=None, resource=None, **unknown_fields):
++        '''
++        errorresult : ErrorResult
++        resource : Resource
++        '''
++        self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None
++        self.resource = Resource.from_json(resource) if resource else None
++
++
++
++class UnitResources(Type):
++    _toSchema = {'download_progress': 'download-progress', 'entity': 'Entity', 'resources': 'resources'}
++    _toPy = {'Entity': 'entity', 'download-progress': 'download_progress', 'resources': 'resources'}
++    def __init__(self, entity=None, download_progress=None, resources=None, **unknown_fields):
++        '''
++        entity : Entity
++        download_progress : typing.Mapping<~KT, +VT_co>[str, int]
++        resources : typing.Sequence<+T_co>[~Resource]<~Resource>
++        '''
++        self.entity = Entity.from_json(entity) if entity else None
++        self.download_progress = download_progress
++        self.resources = [Resource.from_json(o) for o in resources or []]
++
++
++
++class UnitResourcesResult(Type):
++    _toSchema = {'errorresult': 'ErrorResult', 'resources': 'resources'}
++    _toPy = {'ErrorResult': 'errorresult', 'resources': 'resources'}
++    def __init__(self, errorresult=None, resources=None, **unknown_fields):
++        '''
++        errorresult : ErrorResult
++        resources : typing.Sequence<+T_co>[~UnitResourceResult]<~UnitResourceResult>
++        '''
++        self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None
++        self.resources = [UnitResourceResult.from_json(o) for o in resources or []]
++
++
++
++class UnitSettings(Type):
++    _toSchema = {'version': 'version'}
++    _toPy = {'version': 'version'}
++    def __init__(self, version=None, **unknown_fields):
++        '''
++        version : int
++        '''
++        self.version = version
++
++
++
++class UnitStatus(Type):
++    _toSchema = {'agent_status': 'agent-status', 'charm': 'charm', 'leader': 'leader', 'machine': 'machine', 'opened_ports': 'opened-ports', 'public_address': 'public-address', 'subordinates': 'subordinates', 'workload_status': 'workload-status', 'workload_version': 'workload-version'}
++    _toPy = {'agent-status': 'agent_status', 'charm': 'charm', 'leader': 'leader', 'machine': 'machine', 'opened-ports': 'opened_ports', 'public-address': 'public_address', 'subordinates': 'subordinates', 'workload-status': 'workload_status', 'workload-version': 'workload_version'}
++    def __init__(self, agent_status=None, charm=None, leader=None, machine=None, opened_ports=None, public_address=None, subordinates=None, workload_status=None, workload_version=None, **unknown_fields):
++        '''
++        agent_status : DetailedStatus
++        charm : str
++        leader : bool
++        machine : str
++        opened_ports : typing.Sequence<+T_co>[str]
++        public_address : str
++        subordinates : typing.Mapping<~KT, +VT_co>[str, ~UnitStatus]<~UnitStatus>
++        workload_status : DetailedStatus
++        workload_version : str
++        '''
++        self.agent_status = DetailedStatus.from_json(agent_status) if agent_status else None
++        self.charm = charm
++        self.leader = leader
++        self.machine = machine
++        self.opened_ports = opened_ports
++        self.public_address = public_address
++        self.subordinates = subordinates
++        self.workload_status = DetailedStatus.from_json(workload_status) if workload_status else None
++        self.workload_version = workload_version
++
++
++
++class UnitsNetworkConfig(Type):
++    _toSchema = {'args': 'args'}
++    _toPy = {'args': 'args'}
++    def __init__(self, args=None, **unknown_fields):
++        '''
++        args : typing.Sequence<+T_co>[~UnitNetworkConfig]<~UnitNetworkConfig>
++        '''
++        self.args = [UnitNetworkConfig.from_json(o) for o in args or []]
++
++
++
++class UnsetModelDefaults(Type):
++    _toSchema = {'keys': 'keys'}
++    _toPy = {'keys': 'keys'}
++    def __init__(self, keys=None, **unknown_fields):
++        '''
++        keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys>
++        '''
++        self.keys = [ModelUnsetKeys.from_json(o) for o in keys or []]
++
++
++
++class UpdateBehavior(Type):
++    _toSchema = {'enable_os_refresh_update': 'enable-os-refresh-update', 'enable_os_upgrade': 'enable-os-upgrade'}
++    _toPy = {'enable-os-refresh-update': 'enable_os_refresh_update', 'enable-os-upgrade': 'enable_os_upgrade'}
++    def __init__(self, enable_os_refresh_update=None, enable_os_upgrade=None, **unknown_fields):
++        '''
++        enable_os_refresh_update : bool
++        enable_os_upgrade : bool
++        '''
++        self.enable_os_refresh_update = enable_os_refresh_update
++        self.enable_os_upgrade = enable_os_upgrade
++
++
++
++class UpdateCloudCredential(Type):
++    _toSchema = {'credential': 'credential', 'tag': 'tag'}
++    _toPy = {'credential': 'credential', 'tag': 'tag'}
++    def __init__(self, credential=None, tag=None, **unknown_fields):
++        '''
++        credential : CloudCredential
++        tag : str
++        '''
++        self.credential = CloudCredential.from_json(credential) if credential else None
++        self.tag = tag
++
++
++
++class UpdateCloudCredentials(Type):
++    _toSchema = {'credentials': 'credentials'}
++    _toPy = {'credentials': 'credentials'}
++    def __init__(self, credentials=None, **unknown_fields):
++        '''
++        credentials : typing.Sequence<+T_co>[~UpdateCloudCredential]<~UpdateCloudCredential>
++        '''
++        self.credentials = [UpdateCloudCredential.from_json(o) for o in credentials or []]
++
++
++
++class UpgradeMongoParams(Type):
++    _toSchema = {'target': 'target'}
++    _toPy = {'target': 'target'}
++    def __init__(self, target=None, **unknown_fields):
++        '''
++        target : MongoVersion
++        '''
++        self.target = MongoVersion.from_json(target) if target else None
++
++
++
++class UserAccess(Type):
++    _toSchema = {'access': 'access', 'user_tag': 'user-tag'}
++    _toPy = {'access': 'access', 'user-tag': 'user_tag'}
++    def __init__(self, access=None, user_tag=None, **unknown_fields):
++        '''
++        access : str
++        user_tag : str
++        '''
++        self.access = access
++        self.user_tag = user_tag
++
++
++
++class UserAccessResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : UserAccess
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = UserAccess.from_json(result) if result else None
++
++
++
++class UserAccessResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~UserAccessResult]<~UserAccessResult>
++        '''
++        self.results = [UserAccessResult.from_json(o) for o in results or []]
++
++
++
++class UserCloud(Type):
++    _toSchema = {'cloud_tag': 'cloud-tag', 'user_tag': 'user-tag'}
++    _toPy = {'cloud-tag': 'cloud_tag', 'user-tag': 'user_tag'}
++    def __init__(self, cloud_tag=None, user_tag=None, **unknown_fields):
++        '''
++        cloud_tag : str
++        user_tag : str
++        '''
++        self.cloud_tag = cloud_tag
++        self.user_tag = user_tag
++
++
++
++class UserClouds(Type):
++    _toSchema = {'user_clouds': 'user-clouds'}
++    _toPy = {'user-clouds': 'user_clouds'}
++    def __init__(self, user_clouds=None, **unknown_fields):
++        '''
++        user_clouds : typing.Sequence<+T_co>[~UserCloud]<~UserCloud>
++        '''
++        self.user_clouds = [UserCloud.from_json(o) for o in user_clouds or []]
++
++
++
++class UserInfo(Type):
++    _toSchema = {'access': 'access', 'created_by': 'created-by', 'date_created': 'date-created', 'disabled': 'disabled', 'display_name': 'display-name', 'last_connection': 'last-connection', 'username': 'username'}
++    _toPy = {'access': 'access', 'created-by': 'created_by', 'date-created': 'date_created', 'disabled': 'disabled', 'display-name': 'display_name', 'last-connection': 'last_connection', 'username': 'username'}
++    def __init__(self, access=None, created_by=None, date_created=None, disabled=None, display_name=None, last_connection=None, username=None, **unknown_fields):
++        '''
++        access : str
++        created_by : str
++        date_created : str
++        disabled : bool
++        display_name : str
++        last_connection : str
++        username : str
++        '''
++        self.access = access
++        self.created_by = created_by
++        self.date_created = date_created
++        self.disabled = disabled
++        self.display_name = display_name
++        self.last_connection = last_connection
++        self.username = username
++
++
++
++class UserInfoRequest(Type):
++    _toSchema = {'entities': 'entities', 'include_disabled': 'include-disabled'}
++    _toPy = {'entities': 'entities', 'include-disabled': 'include_disabled'}
++    def __init__(self, entities=None, include_disabled=None, **unknown_fields):
++        '''
++        entities : typing.Sequence<+T_co>[~Entity]<~Entity>
++        include_disabled : bool
++        '''
++        self.entities = [Entity.from_json(o) for o in entities or []]
++        self.include_disabled = include_disabled
++
++
++
++class UserInfoResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : UserInfo
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = UserInfo.from_json(result) if result else None
++
++
++
++class UserInfoResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~UserInfoResult]<~UserInfoResult>
++        '''
++        self.results = [UserInfoResult.from_json(o) for o in results or []]
++
++
++
++class UserModel(Type):
++    _toSchema = {'last_connection': 'last-connection', 'model': 'model'}
++    _toPy = {'last-connection': 'last_connection', 'model': 'model'}
++    def __init__(self, last_connection=None, model=None, **unknown_fields):
++        '''
++        last_connection : str
++        model : Model
++        '''
++        self.last_connection = last_connection
++        self.model = Model.from_json(model) if model else None
++
++
++
++class UserModelList(Type):
++    _toSchema = {'user_models': 'user-models'}
++    _toPy = {'user-models': 'user_models'}
++    def __init__(self, user_models=None, **unknown_fields):
++        '''
++        user_models : typing.Sequence<+T_co>[~UserModel]<~UserModel>
++        '''
++        self.user_models = [UserModel.from_json(o) for o in user_models or []]
++
++
++
++class Value(Type):
++    _toSchema = {'arch': 'arch', 'container': 'container', 'cores': 'cores', 'cpu_power': 'cpu-power', 'instance_type': 'instance-type', 'mem': 'mem', 'root_disk': 'root-disk', 'spaces': 'spaces', 'tags': 'tags', 'virt_type': 'virt-type'}
++    _toPy = {'arch': 'arch', 'container': 'container', 'cores': 'cores', 'cpu-power': 'cpu_power', 'instance-type': 'instance_type', 'mem': 'mem', 'root-disk': 'root_disk', 'spaces': 'spaces', 'tags': 'tags', 'virt-type': 'virt_type'}
++    def __init__(self, arch=None, container=None, cores=None, cpu_power=None, instance_type=None, mem=None, root_disk=None, spaces=None, tags=None, virt_type=None, **unknown_fields):
++        '''
++        arch : str
++        container : str
++        cores : int
++        cpu_power : int
++        instance_type : str
++        mem : int
++        root_disk : int
++        spaces : typing.Sequence<+T_co>[str]
++        tags : typing.Sequence<+T_co>[str]
++        virt_type : str
++        '''
++        self.arch = arch
++        self.container = container
++        self.cores = cores
++        self.cpu_power = cpu_power
++        self.instance_type = instance_type
++        self.mem = mem
++        self.root_disk = root_disk
++        self.spaces = spaces
++        self.tags = tags
++        self.virt_type = virt_type
++
++
++
++class Version(Type):
++    _toSchema = {'version': 'version'}
++    _toPy = {'version': 'version'}
++    def __init__(self, version=None, **unknown_fields):
++        '''
++        version : Binary
++        '''
++        self.version = Binary.from_json(version) if version else None
++
++
++
++class VersionResult(Type):
++    _toSchema = {'error': 'error', 'version': 'version'}
++    _toPy = {'error': 'error', 'version': 'version'}
++    def __init__(self, error=None, version=None, **unknown_fields):
++        '''
++        error : Error
++        version : Number
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.version = Number.from_json(version) if version else None
++
++
++
++class VersionResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VersionResult]<~VersionResult>
++        '''
++        self.results = [VersionResult.from_json(o) for o in results or []]
++
++
++
++class Volume(Type):
++    _toSchema = {'info': 'info', 'volume_tag': 'volume-tag'}
++    _toPy = {'info': 'info', 'volume-tag': 'volume_tag'}
++    def __init__(self, info=None, volume_tag=None, **unknown_fields):
++        '''
++        info : VolumeInfo
++        volume_tag : str
++        '''
++        self.info = VolumeInfo.from_json(info) if info else None
++        self.volume_tag = volume_tag
++
++
++
++class VolumeAttachment(Type):
++    _toSchema = {'info': 'info', 'machine_tag': 'machine-tag', 'volume_tag': 'volume-tag'}
++    _toPy = {'info': 'info', 'machine-tag': 'machine_tag', 'volume-tag': 'volume_tag'}
++    def __init__(self, info=None, machine_tag=None, volume_tag=None, **unknown_fields):
++        '''
++        info : VolumeAttachmentInfo
++        machine_tag : str
++        volume_tag : str
++        '''
++        self.info = VolumeAttachmentInfo.from_json(info) if info else None
++        self.machine_tag = machine_tag
++        self.volume_tag = volume_tag
++
++
++
++class VolumeAttachmentDetails(Type):
++    _toSchema = {'life': 'life', 'volumeattachmentinfo': 'VolumeAttachmentInfo'}
++    _toPy = {'VolumeAttachmentInfo': 'volumeattachmentinfo', 'life': 'life'}
++    def __init__(self, volumeattachmentinfo=None, life=None, **unknown_fields):
++        '''
++        volumeattachmentinfo : VolumeAttachmentInfo
++        life : str
++        '''
++        self.volumeattachmentinfo = VolumeAttachmentInfo.from_json(volumeattachmentinfo) if volumeattachmentinfo else None
++        self.life = life
++
++
++
++class VolumeAttachmentInfo(Type):
++    _toSchema = {'bus_address': 'bus-address', 'device_link': 'device-link', 'device_name': 'device-name', 'read_only': 'read-only'}
++    _toPy = {'bus-address': 'bus_address', 'device-link': 'device_link', 'device-name': 'device_name', 'read-only': 'read_only'}
++    def __init__(self, bus_address=None, device_link=None, device_name=None, read_only=None, **unknown_fields):
++        '''
++        bus_address : str
++        device_link : str
++        device_name : str
++        read_only : bool
++        '''
++        self.bus_address = bus_address
++        self.device_link = device_link
++        self.device_name = device_name
++        self.read_only = read_only
++
++
++
++class VolumeAttachmentParams(Type):
++    _toSchema = {'instance_id': 'instance-id', 'machine_tag': 'machine-tag', 'provider': 'provider', 'read_only': 'read-only', 'volume_id': 'volume-id', 'volume_tag': 'volume-tag'}
++    _toPy = {'instance-id': 'instance_id', 'machine-tag': 'machine_tag', 'provider': 'provider', 'read-only': 'read_only', 'volume-id': 'volume_id', 'volume-tag': 'volume_tag'}
++    def __init__(self, instance_id=None, machine_tag=None, provider=None, read_only=None, volume_id=None, volume_tag=None, **unknown_fields):
++        '''
++        instance_id : str
++        machine_tag : str
++        provider : str
++        read_only : bool
++        volume_id : str
++        volume_tag : str
++        '''
++        self.instance_id = instance_id
++        self.machine_tag = machine_tag
++        self.provider = provider
++        self.read_only = read_only
++        self.volume_id = volume_id
++        self.volume_tag = volume_tag
++
++
++
++class VolumeAttachmentParamsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : VolumeAttachmentParams
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = VolumeAttachmentParams.from_json(result) if result else None
++
++
++
++class VolumeAttachmentParamsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VolumeAttachmentParamsResult]<~VolumeAttachmentParamsResult>
++        '''
++        self.results = [VolumeAttachmentParamsResult.from_json(o) for o in results or []]
++
++
++
++class VolumeAttachmentResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : VolumeAttachment
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = VolumeAttachment.from_json(result) if result else None
++
++
++
++class VolumeAttachmentResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VolumeAttachmentResult]<~VolumeAttachmentResult>
++        '''
++        self.results = [VolumeAttachmentResult.from_json(o) for o in results or []]
++
++
++
++class VolumeAttachments(Type):
++    _toSchema = {'volume_attachments': 'volume-attachments'}
++    _toPy = {'volume-attachments': 'volume_attachments'}
++    def __init__(self, volume_attachments=None, **unknown_fields):
++        '''
++        volume_attachments : typing.Sequence<+T_co>[~VolumeAttachment]<~VolumeAttachment>
++        '''
++        self.volume_attachments = [VolumeAttachment.from_json(o) for o in volume_attachments or []]
++
++
++
++class VolumeDetails(Type):
++    _toSchema = {'info': 'info', 'machine_attachments': 'machine-attachments', 'status': 'status', 'storage': 'storage', 'volume_tag': 'volume-tag'}
++    _toPy = {'info': 'info', 'machine-attachments': 'machine_attachments', 'status': 'status', 'storage': 'storage', 'volume-tag': 'volume_tag'}
++    def __init__(self, info=None, machine_attachments=None, status=None, storage=None, volume_tag=None, **unknown_fields):
++        '''
++        info : VolumeInfo
++        machine_attachments : typing.Mapping<~KT, +VT_co>[str, ~VolumeAttachmentInfo]<~VolumeAttachmentInfo>
++        status : EntityStatus
++        storage : StorageDetails
++        volume_tag : str
++        '''
++        self.info = VolumeInfo.from_json(info) if info else None
++        self.machine_attachments = machine_attachments
++        self.status = EntityStatus.from_json(status) if status else None
++        self.storage = StorageDetails.from_json(storage) if storage else None
++        self.volume_tag = volume_tag
++
++
++
++class VolumeDetailsListResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : typing.Sequence<+T_co>[~VolumeDetails]<~VolumeDetails>
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = [VolumeDetails.from_json(o) for o in result or []]
++
++
++
++class VolumeDetailsListResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VolumeDetailsListResult]<~VolumeDetailsListResult>
++        '''
++        self.results = [VolumeDetailsListResult.from_json(o) for o in results or []]
++
++
++
++class VolumeFilter(Type):
++    _toSchema = {'machines': 'machines'}
++    _toPy = {'machines': 'machines'}
++    def __init__(self, machines=None, **unknown_fields):
++        '''
++        machines : typing.Sequence<+T_co>[str]
++        '''
++        self.machines = machines
++
++
++
++class VolumeFilters(Type):
++    _toSchema = {'filters': 'filters'}
++    _toPy = {'filters': 'filters'}
++    def __init__(self, filters=None, **unknown_fields):
++        '''
++        filters : typing.Sequence<+T_co>[~VolumeFilter]<~VolumeFilter>
++        '''
++        self.filters = [VolumeFilter.from_json(o) for o in filters or []]
++
++
++
++class VolumeInfo(Type):
++    _toSchema = {'hardware_id': 'hardware-id', 'persistent': 'persistent', 'size': 'size', 'volume_id': 'volume-id'}
++    _toPy = {'hardware-id': 'hardware_id', 'persistent': 'persistent', 'size': 'size', 'volume-id': 'volume_id'}
++    def __init__(self, hardware_id=None, persistent=None, size=None, volume_id=None, **unknown_fields):
++        '''
++        hardware_id : str
++        persistent : bool
++        size : int
++        volume_id : str
++        '''
++        self.hardware_id = hardware_id
++        self.persistent = persistent
++        self.size = size
++        self.volume_id = volume_id
++
++
++
++class VolumeParams(Type):
++    _toSchema = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'tags': 'tags', 'volume_tag': 'volume-tag'}
++    _toPy = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'tags': 'tags', 'volume-tag': 'volume_tag'}
++    def __init__(self, attachment=None, attributes=None, provider=None, size=None, tags=None, volume_tag=None, **unknown_fields):
++        '''
++        attachment : VolumeAttachmentParams
++        attributes : typing.Mapping<~KT, +VT_co>[str, typing.Any]
++        provider : str
++        size : int
++        tags : typing.Mapping<~KT, +VT_co>[str, str]
++        volume_tag : str
++        '''
++        self.attachment = VolumeAttachmentParams.from_json(attachment) if attachment else None
++        self.attributes = attributes
++        self.provider = provider
++        self.size = size
++        self.tags = tags
++        self.volume_tag = volume_tag
++
++
++
++class VolumeParamsResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : VolumeParams
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = VolumeParams.from_json(result) if result else None
++
++
++
++class VolumeParamsResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VolumeParamsResult]<~VolumeParamsResult>
++        '''
++        self.results = [VolumeParamsResult.from_json(o) for o in results or []]
++
++
++
++class VolumeResult(Type):
++    _toSchema = {'error': 'error', 'result': 'result'}
++    _toPy = {'error': 'error', 'result': 'result'}
++    def __init__(self, error=None, result=None, **unknown_fields):
++        '''
++        error : Error
++        result : Volume
++        '''
++        self.error = Error.from_json(error) if error else None
++        self.result = Volume.from_json(result) if result else None
++
++
++
++class VolumeResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~VolumeResult]<~VolumeResult>
++        '''
++        self.results = [VolumeResult.from_json(o) for o in results or []]
++
++
++
++class Volumes(Type):
++    _toSchema = {'volumes': 'volumes'}
++    _toPy = {'volumes': 'volumes'}
++    def __init__(self, volumes=None, **unknown_fields):
++        '''
++        volumes : typing.Sequence<+T_co>[~Volume]<~Volume>
++        '''
++        self.volumes = [Volume.from_json(o) for o in volumes or []]
++
++
++
++class WatchContainer(Type):
++    _toSchema = {'container_type': 'container-type', 'machine_tag': 'machine-tag'}
++    _toPy = {'container-type': 'container_type', 'machine-tag': 'machine_tag'}
++    def __init__(self, container_type=None, machine_tag=None, **unknown_fields):
++        '''
++        container_type : str
++        machine_tag : str
++        '''
++        self.container_type = container_type
++        self.machine_tag = machine_tag
++
++
++
++class WatchContainers(Type):
++    _toSchema = {'params': 'params'}
++    _toPy = {'params': 'params'}
++    def __init__(self, params=None, **unknown_fields):
++        '''
++        params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer>
++        '''
++        self.params = [WatchContainer.from_json(o) for o in params or []]
++
++
++
++class ZoneResult(Type):
++    _toSchema = {'available': 'available', 'error': 'error', 'name': 'name'}
++    _toPy = {'available': 'available', 'error': 'error', 'name': 'name'}
++    def __init__(self, available=None, error=None, name=None, **unknown_fields):
++        '''
++        available : bool
++        error : Error
++        name : str
++        '''
++        self.available = available
++        self.error = Error.from_json(error) if error else None
++        self.name = name
++
++
++
++class ZoneResults(Type):
++    _toSchema = {'results': 'results'}
++    _toPy = {'results': 'results'}
++    def __init__(self, results=None, **unknown_fields):
++        '''
++        results : typing.Sequence<+T_co>[~ZoneResult]<~ZoneResult>
++        '''
++        self.results = [ZoneResult.from_json(o) for o in results or []]
++
++
index 0000000,0000000..89b5248
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,34 @@@
++'''Replace auto-generated classes with our own, where necessary.
++'''
++
++from . import _client, _definitions, overrides
++
++
++for o in overrides.__all__:
++    if not "Facade" in o:
++        # Override stuff in _definitions, which is all imported
++        # into _client. We Monkey patch both the original class and
++        # the ref in _client (import shenanigans are fun!)
++        setattr(_definitions, o, getattr(overrides, o))
++        setattr(_client, o, getattr(overrides, o))
++    # We shouldn't be overriding Facades!
++    else:
++        raise ValueError(
++            "Cannot override a versioned Facade class -- you must patch "
++            "it instead.")
++
++for o in overrides.__patches__:
++    # Patch a versioned Facade.
++    for client_version in _client.CLIENTS.values():
++        try:
++            c_type = getattr(client_version, o)
++        except AttributeError:
++            # Not all the _client<version> modules may have the
++            # facade. That's okay -- we just skip over them.
++            continue
++        o_type = getattr(overrides, o)
++        for a in dir(o_type):
++            if not a.startswith('_'):
++                setattr(c_type, a, getattr(o_type, a))
++
++from ._client import *  # noqa
index 0000000,0000000..f8a792a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,52 @@@
++from collections import defaultdict
++from io import StringIO
++from textwrap import indent
++
++
++class CodeWriter(StringIO):
++    """
++    Blob of text that, when used in the context of facade.py, ends up
++    holding the source code for a Python class and associated methods.
++
++    """
++    INDENT = "    "
++
++    CLASS = 0
++    METHOD = 1
++
++    def write(self, msg, depth=0):
++        if depth:
++            prefix = self.INDENT * depth
++            msg = indent(msg, prefix)
++
++        return super(CodeWriter, self).write(msg)
++
++    def __str__(self):
++        return super(CodeWriter, self).getvalue()
++
++
++class Capture(defaultdict):
++    """
++    A collection of CodeWriter objects, together representing a Python
++    module.
++
++    """
++
++    def __init__(self, default_factory=CodeWriter, *args, **kwargs):
++        super(Capture, self).__init__(default_factory, *args, **kwargs)
++
++    def clear(self, name):
++        """
++        Reset one of the keys in this class, if it exists.
++
++        This is necessary, because we don't worry about de-duplicating
++        the schemas for each version of juju up front, and this gives
++        us a way to sort of de-duplicate on the fly, by resetting a
++        specific CodeWriter instance before we start to write a class
++        into it.
++
++        """
++        try:
++            del self[name]
++        except KeyError:
++            pass
index 0000000,0000000..7457391
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,623 @@@
++import base64
++import io
++import json
++import logging
++import os
++import random
++import shlex
++import ssl
++import string
++import subprocess
++import weakref
++import websockets
++from concurrent.futures import CancelledError
++from http.client import HTTPSConnection
++from pathlib import Path
++
++import asyncio
++import yaml
++
++from juju import tag, utils
++from juju.client import client
++from juju.errors import JujuError, JujuAPIError, JujuConnectionError
++from juju.utils import IdQueue
++
++log = logging.getLogger("websocket")
++
++
++class Monitor:
++    """
++    Monitor helper class for our Connection class.
++
++    Contains a reference to an instantiated Connection, along with a
++    reference to the Connection.receiver Future. Upon inspecttion of
++    these objects, this class determines whether the connection is in
++    an 'error', 'connected' or 'disconnected' state.
++
++    Use this class to stay up to date on the health of a connection,
++    and take appropriate action if the connection errors out due to
++    network issues or other unexpected circumstances.
++
++    """
++    ERROR = 'error'
++    CONNECTED = 'connected'
++    DISCONNECTING = 'disconnecting'
++    DISCONNECTED = 'disconnected'
++
++    def __init__(self, connection):
++        self.connection = weakref.ref(connection)
++        self.reconnecting = asyncio.Lock(loop=connection.loop)
++        self.close_called = asyncio.Event(loop=connection.loop)
++        self.receiver_stopped = asyncio.Event(loop=connection.loop)
++        self.pinger_stopped = asyncio.Event(loop=connection.loop)
++        self.receiver_stopped.set()
++        self.pinger_stopped.set()
++
++    @property
++    def status(self):
++        """
++        Determine the status of the connection and receiver, and return
++        ERROR, CONNECTED, or DISCONNECTED as appropriate.
++
++        For simplicity, we only consider ourselves to be connected
++        after the Connection class has setup a receiver task. This
++        only happens after the websocket is open, and the connection
++        isn't usable until that receiver has been started.
++
++        """
++        connection = self.connection()
++
++        # the connection instance was destroyed but someone kept
++        # a separate reference to the monitor for some reason
++        if not connection:
++            return self.DISCONNECTED
++
++        # connection cleanly disconnected or not yet opened
++        if not connection.ws:
++            return self.DISCONNECTED
++
++        # close called but not yet complete
++        if self.close_called.is_set():
++            return self.DISCONNECTING
++
++        # connection closed uncleanly (we didn't call connection.close)
++        if self.receiver_stopped.is_set() or not connection.ws.open:
++            return self.ERROR
++
++        # everything is fine!
++        return self.CONNECTED
++
++
++class Connection:
++    """
++    Usage::
++
++        # Connect to an arbitrary api server
++        client = await Connection.connect(
++            api_endpoint, model_uuid, username, password, cacert)
++
++        # Connect using a controller/model name
++        client = await Connection.connect_model('local.local:default')
++
++        # Connect to the currently active model
++        client = await Connection.connect_current()
++
++    Note: Any connection method or constructor can accept an optional `loop`
++    argument to override the default event loop from `asyncio.get_event_loop`.
++    """
++
++    DEFAULT_FRAME_SIZE = 'default_frame_size'
++    MAX_FRAME_SIZE = 2**22
++    "Maximum size for a single frame.  Defaults to 4MB."
++
++    def __init__(
++            self, endpoint, uuid, username, password, cacert=None,
++            macaroons=None, loop=None, max_frame_size=DEFAULT_FRAME_SIZE):
++        self.endpoint = endpoint
++        self._endpoint = endpoint
++        self.uuid = uuid
++        if macaroons:
++            self.macaroons = macaroons
++            self.username = ''
++            self.password = ''
++        else:
++            self.macaroons = []
++            self.username = username
++            self.password = password
++        self.cacert = cacert
++        self._cacert = cacert
++        self.loop = loop or asyncio.get_event_loop()
++
++        self.__request_id__ = 0
++        self.addr = None
++        self.ws = None
++        self.facades = {}
++        self.messages = IdQueue(loop=self.loop)
++        self.monitor = Monitor(connection=self)
++        if max_frame_size is self.DEFAULT_FRAME_SIZE:
++            max_frame_size = self.MAX_FRAME_SIZE
++        self.max_frame_size = max_frame_size
++
++    @property
++    def is_open(self):
++        return self.monitor.status == Monitor.CONNECTED
++
++    def _get_ssl(self, cert=None):
++        return ssl.create_default_context(
++            purpose=ssl.Purpose.CLIENT_AUTH, cadata=cert)
++
++    async def open(self):
++        if self.uuid:
++            url = "wss://{}/model/{}/api".format(self.endpoint, self.uuid)
++        else:
++            url = "wss://{}/api".format(self.endpoint)
++
++        kw = dict()
++        kw['ssl'] = self._get_ssl(self.cacert)
++        kw['loop'] = self.loop
++        kw['max_size'] = self.max_frame_size
++        self.addr = url
++        self.ws = await websockets.connect(url, **kw)
++        self.loop.create_task(self.receiver())
++        self.monitor.receiver_stopped.clear()
++        log.info("Driver connected to juju %s", url)
++        self.monitor.close_called.clear()
++        return self
++
++    async def close(self):
++        if not self.ws:
++            return
++        self.monitor.close_called.set()
++        await self.monitor.pinger_stopped.wait()
++        await self.monitor.receiver_stopped.wait()
++        await self.ws.close()
++        self.ws = None
++
++    async def recv(self, request_id):
++        if not self.is_open:
++            raise websockets.exceptions.ConnectionClosed(0, 'websocket closed')
++        return await self.messages.get(request_id)
++
++    async def receiver(self):
++        try:
++            while self.is_open:
++                result = await utils.run_with_interrupt(
++                    self.ws.recv(),
++                    self.monitor.close_called,
++                    loop=self.loop)
++                if self.monitor.close_called.is_set():
++                    break
++                if result is not None:
++                    result = json.loads(result)
++                    await self.messages.put(result['request-id'], result)
++        except CancelledError:
++            pass
++        except websockets.ConnectionClosed as e:
++            log.warning('Receiver: Connection closed, reconnecting')
++            await self.messages.put_all(e)
++            # the reconnect has to be done as a task because the receiver will
++            # be cancelled by the reconnect and we don't want the reconnect
++            # to be aborted half-way through
++            self.loop.create_task(self.reconnect())
++            return
++        except Exception as e:
++            log.exception("Error in receiver")
++            # make pending listeners aware of the error
++            await self.messages.put_all(e)
++            raise
++        finally:
++            self.monitor.receiver_stopped.set()
++
++    async def pinger(self):
++        '''
++        A Controller can time us out if we are silent for too long. This
++        is especially true in JaaS, which has a fairly strict timeout.
++
++        To prevent timing out, we send a ping every ten seconds.
++
++        '''
++        async def _do_ping():
++            try:
++                await pinger_facade.Ping()
++                await asyncio.sleep(10, loop=self.loop)
++            except CancelledError:
++                pass
++
++        pinger_facade = client.PingerFacade.from_connection(self)
++        try:
++            while True:
++                await utils.run_with_interrupt(
++                    _do_ping(),
++                    self.monitor.close_called,
++                    loop=self.loop)
++                if self.monitor.close_called.is_set():
++                    break
++        finally:
++            self.monitor.pinger_stopped.set()
++            return
++
++    async def rpc(self, msg, encoder=None):
++        self.__request_id__ += 1
++        msg['request-id'] = self.__request_id__
++        if'params' not in msg:
++            msg['params'] = {}
++        if "version" not in msg:
++            msg['version'] = self.facades[msg['type']]
++        outgoing = json.dumps(msg, indent=2, cls=encoder)
++        for attempt in range(3):
++            try:
++                await self.ws.send(outgoing)
++                break
++            except websockets.ConnectionClosed:
++                if attempt == 2:
++                    raise
++                log.warning('RPC: Connection closed, reconnecting')
++                # the reconnect has to be done in a separate task because,
++                # if it is triggered by the pinger, then this RPC call will
++                # be cancelled when the pinger is cancelled by the reconnect,
++                # and we don't want the reconnect to be aborted halfway through
++                await asyncio.wait([self.reconnect()], loop=self.loop)
++        result = await self.recv(msg['request-id'])
++
++        if not result:
++            return result
++
++        if 'error' in result:
++            # API Error Response
++            raise JujuAPIError(result)
++
++        if 'response' not in result:
++            # This may never happen
++            return result
++
++        if 'results' in result['response']:
++            # Check for errors in a result list.
++            errors = []
++            for res in result['response']['results']:
++                if res.get('error', {}).get('message'):
++                    errors.append(res['error']['message'])
++            if errors:
++                raise JujuError(errors)
++
++        elif result['response'].get('error', {}).get('message'):
++            raise JujuError(result['response']['error']['message'])
++
++        return result
++
++    def http_headers(self):
++        """Return dictionary of http headers necessary for making an http
++        connection to the endpoint of this Connection.
++
++        :return: Dictionary of headers
++
++        """
++        if not self.username:
++            return {}
++
++        creds = u'{}:{}'.format(
++            tag.user(self.username),
++            self.password or ''
++        )
++        token = base64.b64encode(creds.encode())
++        return {
++            'Authorization': 'Basic {}'.format(token.decode())
++        }
++
++    def https_connection(self):
++        """Return an https connection to this Connection's endpoint.
++
++        Returns a 3-tuple containing::
++
++            1. The :class:`HTTPSConnection` instance
++            2. Dictionary of auth headers to be used with the connection
++            3. The root url path (str) to be used for requests.
++
++        """
++        endpoint = self.endpoint
++        host, remainder = endpoint.split(':', 1)
++        port = remainder
++        if '/' in remainder:
++            port, _ = remainder.split('/', 1)
++
++        conn = HTTPSConnection(
++            host, int(port),
++            context=self._get_ssl(self.cacert),
++        )
++
++        path = (
++            "/model/{}".format(self.uuid)
++            if self.uuid else ""
++        )
++        return conn, self.http_headers(), path
++
++    async def clone(self):
++        """Return a new Connection, connected to the same websocket endpoint
++        as this one.
++
++        """
++        return await Connection.connect(
++            self.endpoint,
++            self.uuid,
++            self.username,
++            self.password,
++            self.cacert,
++            self.macaroons,
++            self.loop,
++            self.max_frame_size,
++        )
++
++    async def controller(self):
++        """Return a Connection to the controller at self.endpoint
++
++        """
++        return await Connection.connect(
++            self.endpoint,
++            None,
++            self.username,
++            self.password,
++            self.cacert,
++            self.macaroons,
++            self.loop,
++        )
++
++    async def _try_endpoint(self, endpoint, cacert):
++        success = False
++        result = None
++        new_endpoints = []
++
++        self.endpoint = endpoint
++        self.cacert = cacert
++        await self.open()
++        try:
++            result = await self.login()
++            if 'discharge-required-error' in result['response']:
++                log.info('Macaroon discharge required, disconnecting')
++            else:
++                # successful login!
++                log.info('Authenticated')
++                success = True
++        except JujuAPIError as e:
++            if e.error_code != 'redirection required':
++                raise
++            log.info('Controller requested redirect')
++            redirect_info = await self.redirect_info()
++            redir_cacert = redirect_info['ca-cert']
++            new_endpoints = [
++                ("{value}:{port}".format(**s), redir_cacert)
++                for servers in redirect_info['servers']
++                for s in servers if s["scope"] == 'public'
++            ]
++        finally:
++            if not success:
++                await self.close()
++        return success, result, new_endpoints
++
++    async def reconnect(self):
++        """ Force a reconnection.
++        """
++        monitor = self.monitor
++        if monitor.reconnecting.locked() or monitor.close_called.is_set():
++            return
++        async with monitor.reconnecting:
++            await self.close()
++            await self._connect()
++
++    async def _connect(self):
++        endpoints = [(self._endpoint, self._cacert)]
++        while endpoints:
++            _endpoint, _cacert = endpoints.pop(0)
++            success, result, new_endpoints = await self._try_endpoint(
++                _endpoint, _cacert)
++            if success:
++                break
++            endpoints.extend(new_endpoints)
++        else:
++            # ran out of endpoints without a successful login
++            raise Exception("Couldn't authenticate to {}".format(
++                self._endpoint))
++
++        response = result['response']
++        self.info = response.copy()
++        self.build_facades(response.get('facades', {}))
++        self.loop.create_task(self.pinger())
++        self.monitor.pinger_stopped.clear()
++
++    @classmethod
++    async def connect(
++            cls, endpoint, uuid, username, password, cacert=None,
++            macaroons=None, loop=None, max_frame_size=None):
++        """Connect to the websocket.
++
++        If uuid is None, the connection will be to the controller. Otherwise it
++        will be to the model.
++
++        """
++        client = cls(endpoint, uuid, username, password, cacert, macaroons,
++                     loop, max_frame_size)
++        await client._connect()
++        return client
++
++    @classmethod
++    async def connect_current(cls, loop=None, max_frame_size=None):
++        """Connect to the currently active model.
++
++        """
++        jujudata = JujuData()
++
++        controller_name = jujudata.current_controller()
++        if not controller_name:
++            raise JujuConnectionError('No current controller')
++
++        model_name = jujudata.current_model()
++
++        return await cls.connect_model(
++            '{}:{}'.format(controller_name, model_name), loop, max_frame_size)
++
++    @classmethod
++    async def connect_current_controller(cls, loop=None, max_frame_size=None):
++        """Connect to the currently active controller.
++
++        """
++        jujudata = JujuData()
++        controller_name = jujudata.current_controller()
++        if not controller_name:
++            raise JujuConnectionError('No current controller')
++
++        return await cls.connect_controller(controller_name, loop,
++                                            max_frame_size)
++
++    @classmethod
++    async def connect_controller(cls, controller_name, loop=None,
++                                 max_frame_size=None):
++        """Connect to a controller by name.
++
++        """
++        jujudata = JujuData()
++        controller = jujudata.controllers()[controller_name]
++        endpoint = controller['api-endpoints'][0]
++        cacert = controller.get('ca-cert')
++        accounts = jujudata.accounts()[controller_name]
++        username = accounts['user']
++        password = accounts.get('password')
++        macaroons = get_macaroons(controller_name) if not password else None
++
++        return await cls.connect(
++            endpoint, None, username, password, cacert, macaroons, loop,
++            max_frame_size)
++
++    @classmethod
++    async def connect_model(cls, model, loop=None, max_frame_size=None):
++        """Connect to a model by name.
++
++        :param str model: [<controller>:]<model>
++
++        """
++        jujudata = JujuData()
++
++        if ':' in model:
++            # explicit controller given
++            controller_name, model_name = model.split(':')
++        else:
++            # use the current controller if one isn't explicitly given
++            controller_name = jujudata.current_controller()
++            model_name = model
++
++        accounts = jujudata.accounts()[controller_name]
++        username = accounts['user']
++        # model name must include a user prefix, so add it if it doesn't
++        if '/' not in model_name:
++            model_name = '{}/{}'.format(username, model_name)
++
++        controller = jujudata.controllers()[controller_name]
++        endpoint = controller['api-endpoints'][0]
++        cacert = controller.get('ca-cert')
++        password = accounts.get('password')
++        models = jujudata.models()[controller_name]
++        model_uuid = models['models'][model_name]['uuid']
++        macaroons = get_macaroons(controller_name) if not password else None
++
++        return await cls.connect(
++            endpoint, model_uuid, username, password, cacert, macaroons, loop,
++            max_frame_size)
++
++    def build_facades(self, facades):
++        self.facades.clear()
++        for facade in facades:
++            self.facades[facade['name']] = facade['versions'][-1]
++
++    async def login(self):
++        username = self.username
++        if username and not username.startswith('user-'):
++            username = 'user-{}'.format(username)
++
++        result = await self.rpc({
++            "type": "Admin",
++            "request": "Login",
++            "version": 3,
++            "params": {
++                "auth-tag": username,
++                "credentials": self.password,
++                "nonce": "".join(random.sample(string.printable, 12)),
++                "macaroons": self.macaroons
++            }})
++        return result
++
++    async def redirect_info(self):
++        try:
++            result = await self.rpc({
++                "type": "Admin",
++                "request": "RedirectInfo",
++                "version": 3,
++            })
++        except JujuAPIError as e:
++            if e.message == 'not redirected':
++                return None
++            raise
++        return result['response']
++
++
++class JujuData:
++    def __init__(self):
++        self.path = os.environ.get('JUJU_DATA') or '~/.local/share/juju'
++        self.path = os.path.abspath(os.path.expanduser(self.path))
++
++    def current_controller(self):
++        cmd = shlex.split('juju list-controllers --format yaml')
++        output = subprocess.check_output(cmd)
++        output = yaml.safe_load(output)
++        return output.get('current-controller', '')
++
++    def current_model(self, controller_name=None):
++        if not controller_name:
++            controller_name = self.current_controller()
++        models = self.models()[controller_name]
++        if 'current-model' not in models:
++            raise JujuError('No current model')
++        return models['current-model']
++
++    def controllers(self):
++        return self._load_yaml('controllers.yaml', 'controllers')
++
++    def models(self):
++        return self._load_yaml('models.yaml', 'controllers')
++
++    def accounts(self):
++        return self._load_yaml('accounts.yaml', 'controllers')
++
++    def _load_yaml(self, filename, key):
++        filepath = os.path.join(self.path, filename)
++        with io.open(filepath, 'rt') as f:
++            return yaml.safe_load(f)[key]
++
++
++def get_macaroons(controller_name=None):
++    """Decode and return macaroons from default ~/.go-cookies
++
++    """
++    cookie_files = []
++    if controller_name:
++        cookie_files.append('~/.local/share/juju/cookies/{}.json'.format(
++            controller_name))
++    cookie_files.append('~/.go-cookies')
++    for cookie_file in cookie_files:
++        cookie_file = Path(cookie_file).expanduser()
++        if cookie_file.exists():
++            try:
++                cookies = json.loads(cookie_file.read_text())
++                break
++            except (OSError, ValueError):
++                log.warn("Couldn't load macaroons from %s", cookie_file)
++                return []
++    else:
++        log.warn("Couldn't load macaroons from %s", ' or '.join(cookie_files))
++        return []
++
++    base64_macaroons = [
++        c['Value'] for c in cookies
++        if c['Name'].startswith('macaroon-') and c['Value']
++    ]
++
++    return [
++        json.loads(base64.b64decode(value).decode('utf-8'))
++        for value in base64_macaroons
++    ]
index 0000000,0000000..c959e01
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,784 @@@
++import argparse
++import builtins
++from collections import defaultdict
++import functools
++from glob import glob
++import json
++import keyword
++from pathlib import Path
++import pprint
++import re
++import textwrap
++from typing import Sequence, Mapping, TypeVar, Any, Union
++import typing
++
++from . import codegen
++
++_marker = object()
++
++JUJU_VERSION = re.compile('[0-9]+\.[0-9-]+[\.\-][0-9a-z]+(\.[0-9]+)?')
++# Workaround for https://bugs.launchpad.net/juju/+bug/1683906
++NAUGHTY_CLASSES = ['ClientFacade', 'Client', 'FullStatus', 'ModelStatusInfo',
++                   'ModelInfo']
++
++
++# Map basic types to Python's typing with a callable
++SCHEMA_TO_PYTHON = {
++    'string': str,
++    'integer': int,
++    'float': float,
++    'number': float,
++    'boolean': bool,
++    'object': Any,
++}
++
++
++# Friendly warning message to stick at the top of generated files.
++HEADER = """\
++# DO NOT CHANGE THIS FILE! This file is auto-generated by facade.py.
++# Changes will be overwritten/lost when the file is regenerated.
++
++"""
++
++
++# Classes and helper functions that we'll write to _client.py
++LOOKUP_FACADE = '''
++def lookup_facade(name, version):
++        """
++        Given a facade name and version, attempt to pull that facade out
++        of the correct client<version>.py file.
++
++        """
++        try:
++            facade = getattr(CLIENTS[str(version)], name)
++        except KeyError:
++            raise ImportError("No facades found for version {}".format(version))
++        except AttributeError:
++            raise ImportError(
++                "No facade with name '{}' in version {}".format(name, version))
++        return facade
++
++
++'''
++
++TYPE_FACTORY = '''
++class TypeFactory:
++    @classmethod
++    def from_connection(cls, connection):
++        """
++        Given a connected Connection object, return an initialized and
++        connected instance of an API Interface matching the name of
++        this class.
++
++        @param connection: initialized Connection object.
++
++        """
++        version = connection.facades[cls.__name__[:-6]]
++
++        c = lookup_facade(cls.__name__, version)
++        c = c()
++        c.connect(connection)
++
++        return c
++
++
++'''
++
++CLIENT_TABLE = '''
++CLIENTS = {{
++    {clients}
++}}
++
++
++'''
++
++
++class KindRegistry(dict):
++    def register(self, name, version, obj):
++        self[name] = {version: {
++            "object": obj,
++        }}
++
++    def lookup(self, name, version=None):
++        """If version is omitted, max version is used"""
++        versions = self.get(name)
++        if not versions:
++            return None
++        if version:
++            return versions[version]
++        return versions[max(versions)]
++
++    def getObj(self, name, version=None):
++        result = self.lookup(name, version)
++        if result:
++            obj = result["object"]
++            return obj
++        return None
++
++
++class TypeRegistry(dict):
++    def get(self, name):
++        # Two way mapping
++        refname = Schema.referenceName(name)
++        if refname not in self:
++            result = TypeVar(refname)
++            self[refname] = result
++            self[result] = refname
++
++        return self[refname]
++
++_types = TypeRegistry()
++_registry = KindRegistry()
++CLASSES = {}
++factories = codegen.Capture()
++
++
++def booler(v):
++    if isinstance(v, str):
++        if v == "false":
++            return False
++    return bool(v)
++
++
++def getRefType(ref):
++    return _types.get(ref)
++
++
++def refType(obj):
++    return getRefType(obj["$ref"])
++
++
++def objType(obj):
++    kind = obj.get('type')
++    if not kind:
++        raise ValueError("%s has no type" % obj)
++    result = SCHEMA_TO_PYTHON.get(kind)
++    if not result:
++        raise ValueError("%s has type %s" % (obj, kind))
++    return result
++
++
++basic_types = [str, bool, int, float]
++
++
++def name_to_py(name):
++    result = name.replace("-", "_")
++    result = result.lower()
++    if keyword.iskeyword(result) or result in dir(builtins):
++        result += "_"
++    return result
++
++
++def strcast(kind, keep_builtins=False):
++    if issubclass(kind, typing.GenericMeta):
++        return str(kind)[1:]
++    if str(kind).startswith('~'):
++        return str(kind)[1:]
++    if (kind in basic_types or
++            type(kind) in basic_types) and keep_builtins is False:
++        return kind.__name__
++    return kind
++
++
++class Args(list):
++    def __init__(self, defs):
++        self.defs = defs
++        if defs:
++            rtypes = _registry.getObj(_types[defs])
++            if len(rtypes) == 1:
++                if not self.do_explode(rtypes[0][1]):
++                    for name, rtype in rtypes:
++                        self.append((name, rtype))
++            else:
++                for name, rtype in rtypes:
++                    self.append((name, rtype))
++
++    def do_explode(self, kind):
++        if kind in basic_types or type(kind) is typing.TypeVar:
++            return False
++        if not issubclass(kind, (typing.Sequence,
++                                 typing.Mapping)):
++            self.clear()
++            self.extend(Args(kind))
++            return True
++        return False
++
++    def PyToSchemaMapping(self):
++        m = {}
++        for n, rt in self:
++            m[name_to_py(n)] = n
++        return m
++
++    def SchemaToPyMapping(self):
++        m = {}
++        for n, tr in self:
++            m[n] = name_to_py(n)
++        return m
++
++    def _format(self, name, rtype, typed=True):
++        if typed:
++            return "{} : {}".format(
++                name_to_py(name),
++                strcast(rtype)
++            )
++        else:
++            return name_to_py(name)
++
++    def _get_arg_str(self, typed=False, joined=", "):
++        if self:
++            parts = []
++            for item in self:
++                parts.append(self._format(item[0], item[1], typed))
++            if joined:
++                return joined.join(parts)
++            return parts
++        return ''
++
++    def as_kwargs(self):
++        if self:
++            parts = []
++            for item in self:
++                parts.append('{}=None'.format(name_to_py(item[0])))
++            return ', '.join(parts)
++        return ''
++
++    def typed(self):
++        return self._get_arg_str(True)
++
++    def __str__(self):
++        return self._get_arg_str(False)
++
++    def get_doc(self):
++        return self._get_arg_str(True, "\n")
++
++
++def buildTypes(schema, capture):
++    INDENT = "    "
++    for kind in sorted((k for k in _types if not isinstance(k, str)),
++                       key=lambda x: str(x)):
++        name = _types[kind]
++        if name in capture and not name in NAUGHTY_CLASSES:
++            continue
++        args = Args(kind)
++        # Write Factory class for _client.py
++        make_factory(name)
++        # Write actual class
++        source = ["""
++class {}(Type):
++    _toSchema = {}
++    _toPy = {}
++    def __init__(self{}{}, **unknown_fields):
++        '''
++{}
++        '''""".format(
++            name,
++            # pprint these to get stable ordering across regens
++            pprint.pformat(args.PyToSchemaMapping(), width=999),
++            pprint.pformat(args.SchemaToPyMapping(), width=999),
++            ", " if args else "",
++            args.as_kwargs(),
++            textwrap.indent(args.get_doc(), INDENT * 2))
++                  ]
++        assignments = args._get_arg_str(False, False)
++
++        if not args:
++            source.append("{}pass".format(INDENT * 2))
++        else:
++            for arg in args:
++                arg_name = name_to_py(arg[0])
++                arg_type = arg[1]
++                arg_type_name = strcast(arg_type)
++                if arg_type in basic_types:
++                    source.append("{}self.{} = {}".format(INDENT * 2, arg_name, arg_name))
++                elif issubclass(arg_type, typing.Sequence):
++                    value_type = (
++                        arg_type_name.__parameters__[0]
++                        if len(arg_type_name.__parameters__)
++                        else None
++                    )
++                    if type(value_type) is typing.TypeVar:
++                        source.append("{}self.{} = [{}.from_json(o) for o in {} or []]".format(
++                            INDENT * 2, arg_name, strcast(value_type), arg_name))
++                    else:
++                        source.append("{}self.{} = {}".format(INDENT * 2, arg_name, arg_name))
++                elif issubclass(arg_type, typing.Mapping):
++                    value_type = (
++                        arg_type_name.__parameters__[1]
++                        if len(arg_type_name.__parameters__) > 1
++                        else None
++                    )
++                    if type(value_type) is typing.TypeVar:
++                        source.append("{}self.{} = {{k: {}.from_json(v) for k, v in ({} or dict()).items()}}".format(
++                            INDENT * 2, arg_name, strcast(value_type), arg_name))
++                    else:
++                        source.append("{}self.{} = {}".format(INDENT * 2, arg_name, arg_name))
++                elif type(arg_type) is typing.TypeVar:
++                    source.append("{}self.{} = {}.from_json({}) if {} else None".format(
++                        INDENT * 2, arg_name, arg_type_name, arg_name, arg_name))
++                else:
++                    source.append("{}self.{} = {}".format(INDENT * 2, arg_name, arg_name))
++
++        source = "\n".join(source)
++        capture.clear(name)
++        capture[name].write(source)
++        capture[name].write("\n\n")
++        co = compile(source, __name__, "exec")
++        ns = _getns()
++        exec(co, ns)
++        cls = ns[name]
++        CLASSES[name] = cls
++
++
++def retspec(defs):
++    # return specs
++    # only return 1, so if there is more than one type
++    # we need to include a union
++    # In truth there is only 1 return
++    # Error or the expected Type
++    if not defs:
++        return None
++    if defs in basic_types:
++        return strcast(defs, False)
++    rtypes = _registry.getObj(_types[defs])
++    if not rtypes:
++        return None
++    if len(rtypes) > 1:
++        return Union[tuple([strcast(r[1], True) for r in rtypes])]
++    return strcast(rtypes[0][1], False)
++
++
++def return_type(defs):
++    if not defs:
++        return None
++    rtypes = _registry.getObj(_types[defs])
++    if not rtypes:
++        return None
++    if len(rtypes) > 1:
++        for n, t in rtypes:
++            if n == "Error":
++                continue
++            return t
++    return rtypes[0][1]
++
++
++def type_anno_func(func, defs, is_result=False):
++    annos = {}
++    if not defs:
++        return func
++    rtypes = _registry.getObj(_types[defs])
++    if is_result:
++        kn = "return"
++        if not rtypes:
++            annos[kn] = None
++        elif len(rtypes) > 1:
++            annos[kn] = Union[tuple([r[1] for r in rtypes])]
++        else:
++            annos[kn] = rtypes[0][1]
++    else:
++        for name, rtype in rtypes:
++            name = name_to_py(name)
++            annos[name] = rtype
++    func.__annotations__.update(annos)
++    return func
++
++
++def ReturnMapping(cls):
++    # Annotate the method with a return Type
++    # so the value can be cast
++    def decorator(f):
++        @functools.wraps(f)
++        async def wrapper(*args, **kwargs):
++            nonlocal cls
++            reply = await f(*args, **kwargs)
++            if cls is None:
++                return reply
++            if 'error' in reply:
++                cls = CLASSES['Error']
++            if issubclass(cls, typing.Sequence):
++                result = []
++                item_cls = cls.__parameters__[0]
++                for item in reply:
++                    result.append(item_cls.from_json(item))
++                    """
++                    if 'error' in item:
++                        cls = CLASSES['Error']
++                    else:
++                        cls = item_cls
++                    result.append(cls.from_json(item))
++                    """
++            else:
++                result = cls.from_json(reply['response'])
++
++            return result
++        return wrapper
++    return decorator
++
++
++def makeFunc(cls, name, params, result, async=True):
++    INDENT = "    "
++    args = Args(params)
++    assignments = []
++    toschema = args.PyToSchemaMapping()
++    for arg in args._get_arg_str(False, False):
++        assignments.append("{}_params[\'{}\'] = {}".format(INDENT,
++                                                           toschema[arg],
++                                                           arg))
++    assignments = "\n".join(assignments)
++    res = retspec(result)
++    source = """
++
++@ReturnMapping({rettype})
++{async}def {name}(self{argsep}{args}):
++    '''
++{docstring}
++    Returns -> {res}
++    '''
++    # map input types to rpc msg
++    _params = dict()
++    msg = dict(type='{cls.name}', request='{name}', version={cls.version}, params=_params)
++{assignments}
++    reply = {await}self.rpc(msg)
++    return reply
++
++"""
++
++    fsource = source.format(async="async " if async else "",
++                            name=name,
++                            argsep=", " if args else "",
++                            args=args,
++                            res=res,
++                            rettype=result.__name__ if result else None,
++                            docstring=textwrap.indent(args.get_doc(), INDENT),
++                            cls=cls,
++                            assignments=assignments,
++                            await="await " if async else "")
++    ns = _getns()
++    exec(fsource, ns)
++    func = ns[name]
++    return func, fsource
++
++
++def buildMethods(cls, capture):
++    properties = cls.schema['properties']
++    for methodname in sorted(properties):
++        method, source = _buildMethod(cls, methodname)
++        setattr(cls, methodname, method)
++        capture["{}Facade".format(cls.__name__)].write(source, depth=1)
++
++
++def _buildMethod(cls, name):
++    params = None
++    result = None
++    method = cls.schema['properties'][name]
++    if 'properties' in method:
++        prop = method['properties']
++        spec = prop.get('Params')
++        if spec:
++            params = _types.get(spec['$ref'])
++        spec = prop.get('Result')
++        if spec:
++            if '$ref' in spec:
++                result = _types.get(spec['$ref'])
++            else:
++                result = SCHEMA_TO_PYTHON[spec['type']]
++    return makeFunc(cls, name, params, result)
++
++
++def buildFacade(schema):
++    cls = type(schema.name, (Type,), dict(name=schema.name,
++                                          version=schema.version,
++                                          schema=schema))
++    source = """
++class {name}Facade(Type):
++    name = '{name}'
++    version = {version}
++    schema = {schema}
++    """.format(name=schema.name,
++               version=schema.version,
++               schema=textwrap.indent(pprint.pformat(schema), "    "))
++    return cls, source
++
++
++class TypeEncoder(json.JSONEncoder):
++    def default(self, obj):
++        if isinstance(obj, Type):
++            return obj.serialize()
++        return json.JSONEncoder.default(self, obj)
++
++
++class Type:
++    def connect(self, connection):
++        self.connection = connection
++
++    async def rpc(self, msg):
++        result = await self.connection.rpc(msg, encoder=TypeEncoder)
++        return result
++
++    @classmethod
++    def from_json(cls, data):
++        if isinstance(data, cls):
++            return data
++        if isinstance(data, str):
++            try:
++                data = json.loads(data)
++            except json.JSONDecodeError:
++                raise
++        d = {}
++        for k, v in (data or {}).items():
++            d[cls._toPy.get(k, k)] = v
++
++        try:
++            return cls(**d)
++        except TypeError:
++            raise
++
++    def serialize(self):
++        d = {}
++        for attr, tgt in self._toSchema.items():
++            d[tgt] = getattr(self, attr)
++        return d
++
++    def to_json(self):
++        return json.dumps(self.serialize())
++
++
++class Schema(dict):
++    def __init__(self, schema):
++        self.name = schema['Name']
++        self.version = schema['Version']
++        self.update(schema['Schema'])
++
++    @classmethod
++    def referenceName(cls, ref):
++        if ref.startswith("#/definitions/"):
++            ref = ref.rsplit("/", 1)[-1]
++        return ref
++
++    def resolveDefinition(self, ref):
++        return self['definitions'][self.referenceName(ref)]
++
++    def deref(self, prop, name):
++        if not isinstance(prop, dict):
++            raise TypeError(prop)
++        if "$ref" not in prop:
++            return prop
++
++        target = self.resolveDefinition(prop["$ref"])
++        return target
++
++    def buildDefinitions(self):
++        # here we are building the types out
++        # anything in definitions is a type
++        # but these may contain references themselves
++        # so we dfs to the bottom and build upwards
++        # when a types is already in the registry
++        defs = self.get('definitions')
++        if not defs:
++            return
++        for d, data in defs.items():
++            if d in _registry and not d in NAUGHTY_CLASSES:
++                continue
++            node = self.deref(data, d)
++            kind = node.get("type")
++            if kind == "object":
++                result = self.buildObject(node, d)
++            elif kind == "array":
++                pass
++            _registry.register(d, self.version, result)
++            # XXX: This makes sure that the type gets added to the global
++            # _types dict even if no other type in the schema has a ref
++            # to it.
++            getRefType(d)
++
++    def buildObject(self, node, name=None, d=0):
++        # we don't need to build types recursively here
++        # they are all in definitions already
++        # we only want to include the type reference
++        # which we can derive from the name
++        struct = []
++        add = struct.append
++        props = node.get("properties")
++        pprops = node.get("patternProperties")
++        if props:
++            # Sort these so the __init__ arg list for each Type remains
++            # consistently ordered across regens of client.py
++            for p in sorted(props):
++                prop = props[p]
++                if "$ref" in prop:
++                    add((p, refType(prop)))
++                else:
++                    kind = prop['type']
++                    if kind == "array":
++                        add((p, self.buildArray(prop, d + 1)))
++                    elif kind == "object":
++                        struct.extend(self.buildObject(prop, p, d + 1))
++                    else:
++                        add((p, objType(prop)))
++        if pprops:
++            if ".*" not in pprops:
++                raise ValueError(
++                    "Cannot handle actual pattern in patternProperties %s" %
++                    pprops)
++            pprop = pprops[".*"]
++            if "$ref" in pprop:
++                add((name, Mapping[str, refType(pprop)]))
++                return struct
++            ppkind = pprop["type"]
++            if ppkind == "array":
++                add((name, self.buildArray(pprop, d + 1)))
++            else:
++                add((name, Mapping[str, SCHEMA_TO_PYTHON[ppkind]]))
++
++        if not struct and node.get('additionalProperties', False):
++            add((name, Mapping[str, SCHEMA_TO_PYTHON['object']]))
++
++        return struct
++
++    def buildArray(self, obj, d=0):
++        # return a sequence from an array in the schema
++        if "$ref" in obj:
++            return Sequence[refType(obj)]
++        else:
++            kind = obj.get("type")
++            if kind and kind == "array":
++                items = obj['items']
++                return self.buildArray(items, d + 1)
++            else:
++                return Sequence[objType(obj)]
++
++
++def _getns():
++    ns = {'Type': Type,
++          'typing': typing,
++          'ReturnMapping': ReturnMapping
++          }
++    # Copy our types into the globals of the method
++    for facade in _registry:
++        ns[facade] = _registry.getObj(facade)
++    return ns
++
++
++def make_factory(name):
++    if name in factories:
++        del factories[name]
++    factories[name].write("class {}(TypeFactory):\n    pass\n\n".format(name))
++
++
++def write_facades(captures, options):
++    """
++    Write the Facades to the appropriate _client<version>.py
++
++    """
++    for version in sorted(captures.keys()):
++        filename = "{}/_client{}.py".format(options.output_dir, version)
++        with open(filename, "w") as f:
++            f.write(HEADER)
++            f.write("from juju.client.facade import Type, ReturnMapping\n")
++            f.write("from juju.client._definitions import *\n\n")
++            for key in sorted(
++                    [k for k in captures[version].keys() if "Facade" in k]):
++                print(captures[version][key], file=f)
++
++    # Return the last (most recent) version for use in other routines.
++    return version
++
++
++def write_definitions(captures, options, version):
++    """
++    Write auxillary (non versioned) classes to
++    _definitions.py The auxillary classes currently get
++    written redudantly into each capture object, so we can look in
++    one of them -- we just use the last one from the loop above.
++
++    """
++    with open("{}/_definitions.py".format(options.output_dir), "w") as f:
++        f.write(HEADER)
++        f.write("from juju.client.facade import Type, ReturnMapping\n\n")
++        for key in sorted(
++                [k for k in captures[version].keys() if "Facade" not in k]):
++            print(captures[version][key], file=f)
++
++
++def write_client(captures, options):
++    """
++    Write the TypeFactory classes to _client.py, along with some
++    imports and tables so that we can look up versioned Facades.
++
++    """
++    with open("{}/_client.py".format(options.output_dir), "w") as f:
++        f.write(HEADER)
++        f.write("from juju.client._definitions import *\n\n")
++        clients = ", ".join("_client{}".format(v) for v in captures)
++        f.write("from juju.client import " + clients + "\n\n")
++        f.write(CLIENT_TABLE.format(clients=",\n    ".join(
++            ['"{}": _client{}'.format(v, v) for v in captures])))
++        f.write(LOOKUP_FACADE)
++        f.write(TYPE_FACTORY)
++        for key in sorted([k for k in factories.keys() if "Facade" in k]):
++            print(factories[key], file=f)
++
++
++def generate_facades(options):
++    captures = defaultdict(codegen.Capture)
++    schemas = {}
++    for p in sorted(glob(options.schema)):
++        if 'latest' in p:
++            juju_version = 'latest'
++        else:
++            try:
++                juju_version = re.search(JUJU_VERSION, p).group()
++            except AttributeError:
++                print("Cannot extract a juju version from {}".format(p))
++                print("Schemas must include a juju version in the filename")
++                raise SystemExit(1)
++
++        new_schemas = json.loads(Path(p).read_text("utf-8"))
++        schemas[juju_version] = [Schema(s) for s in new_schemas]
++
++    # Build all of the auxillary (unversioned) classes
++    # TODO: get rid of some of the excess trips through loops in the
++    # called functions.
++    for juju_version in sorted(schemas.keys()):
++        for schema in schemas[juju_version]:
++            schema.buildDefinitions()
++            buildTypes(schema, captures[schema.version])
++
++    # Build the Facade classes
++    for juju_version in sorted(schemas.keys()):
++        for schema in schemas[juju_version]:
++            cls, source = buildFacade(schema)
++            cls_name = "{}Facade".format(schema.name)
++
++            captures[schema.version].clear(cls_name)
++            # Make the factory class for _client.py
++            make_factory(cls_name)
++            # Make the actual class
++            captures[schema.version][cls_name].write(source)
++            # Build the methods for each Facade class.
++            buildMethods(cls, captures[schema.version])
++            # Mark this Facade class as being done for this version --
++            # helps mitigate some excessive looping.
++            CLASSES[schema.name] = cls
++
++    return captures
++
++def setup():
++    parser = argparse.ArgumentParser()
++    parser.add_argument("-s", "--schema", default="juju/client/schemas*")
++    parser.add_argument("-o", "--output_dir", default="juju/client")
++    options = parser.parse_args()
++    return options
++
++def main():
++    options = setup()
++
++    # Generate some text blobs
++    captures = generate_facades(options)
++
++    # ... and write them out
++    last_version = write_facades(captures, options)
++    write_definitions(captures, options, last_version)
++    write_client(captures, options)
++
++if __name__ == '__main__':
++    main()
index 0000000,0000000..f439adb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,275 @@@
++from collections import namedtuple
++import re
++
++from .facade import ReturnMapping, Type, TypeEncoder
++from .import _client
++from .import _definitions
++
++
++__all__ = [
++    'Delta',
++    'Number',
++    'Binary',
++    'ConfigValue',
++]
++
++__patches__ = [
++    'ResourcesFacade',
++    'AllWatcherFacade',
++]
++
++
++class Delta(Type):
++    """A single websocket delta.
++
++    :ivar entity: The entity name, e.g. 'unit', 'application'
++    :vartype entity: str
++
++    :ivar type: The delta type, e.g. 'add', 'change', 'remove'
++    :vartype type: str
++
++    :ivar data: The raw delta data
++    :vartype data: dict
++
++    NOTE: The 'data' variable above is being incorrectly cross-linked by a
++    Sphinx bug: https://github.com/sphinx-doc/sphinx/issues/2549
++
++    """
++    _toSchema = {'deltas': 'deltas'}
++    _toPy = {'deltas': 'deltas'}
++
++    def __init__(self, deltas=None):
++        """
++        :param deltas: [str, str, object]
++
++        """
++        self.deltas = deltas
++
++        Change = namedtuple('Change', 'entity type data')
++        change = Change(*self.deltas)
++
++        self.entity = change.entity
++        self.type = change.type
++        self.data = change.data
++
++    @classmethod
++    def from_json(cls, data):
++        return cls(deltas=data)
++
++
++class ResourcesFacade(Type):
++    """Patch parts of ResourcesFacade to make it work.
++    """
++
++    @ReturnMapping(_client.AddPendingResourcesResult)
++    async def AddPendingResources(self, application_tag, charm_url, resources):
++        """Fix the calling signature of AddPendingResources.
++
++        The ResourcesFacade doesn't conform to the standard facade pattern in
++        the Juju source, which leads to the schemagened code not matching up
++        properly with the actual calling convention in the API.  There is work
++        planned to fix this in Juju, but we have to work around it for now.
++
++        application_tag : str
++        charm_url : str
++        resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource>
++        Returns -> typing.Union[_ForwardRef('ErrorResult'),
++                                typing.Sequence<+T_co>[str]]
++        """
++        # map input types to rpc msg
++        _params = dict()
++        msg = dict(type='Resources',
++                   request='AddPendingResources',
++                   version=1,
++                   params=_params)
++        _params['tag'] = application_tag
++        _params['url'] = charm_url
++        _params['resources'] = resources
++        reply = await self.rpc(msg)
++        return reply
++
++
++class AllWatcherFacade(Type):
++    """
++    Patch rpc method of allwatcher to add in 'id' stuff.
++
++    """
++    async def rpc(self, msg):
++        if not hasattr(self, 'Id'):
++            client = _client.ClientFacade.from_connection(self.connection)
++
++            result = await client.WatchAll()
++            self.Id = result.watcher_id
++
++        msg['Id'] = self.Id
++        result = await self.connection.rpc(msg, encoder=TypeEncoder)
++        return result
++
++
++class Number(_definitions.Number):
++    """
++    This type represents a semver string.
++
++    Because it is not standard JSON, the typical from_json parsing fails and
++    the parsing must be handled specially.
++
++    See https://github.com/juju/version for more info.
++    """
++    numberPat = re.compile(r'^(\d{1,9})\.(\d{1,9})(?:\.|-([a-z]+))(\d{1,9})(\.\d{1,9})?$')  # noqa
++
++    def __init__(self, major=None, minor=None, patch=None, tag=None,
++                 build=None, **unknown_fields):
++        '''
++        major : int
++        minor : int
++        patch : int
++        tag : str
++        build : int
++        '''
++        self.major = int(major or '0')
++        self.minor = int(minor or '0')
++        self.patch = int(patch or '0')
++        self.tag = tag or ''
++        self.build = int(build or '0')
++
++    def __repr__(self):
++        return '<Number major={} minor={} patch={} tag={} build={}>'.format(
++            self.major, self.minor, self.patch, self.tag, self.build)
++
++    def __str__(self):
++        return self.serialize()
++
++    def __eq__(self, other):
++        return (
++            isinstance(other, type(self)) and
++            other.major == self.major and
++            other.minor == self.minor and
++            other.tag == self.tag and
++            other.patch == self.patch and
++            other.build == self.build)
++
++    @classmethod
++    def from_json(cls, data):
++        parsed = None
++        if isinstance(data, cls):
++            return data
++        elif data is None:
++            return cls()
++        elif isinstance(data, dict):
++            parsed = data
++        elif isinstance(data, str):
++            match = cls.numberPat.match(data)
++            if match:
++                parsed = {
++                    'major': match.group(1),
++                    'minor': match.group(2),
++                    'tag': match.group(3),
++                    'patch': match.group(4),
++                    'build': (match.group(5)[1:] if match.group(5)
++                              else 0),
++                }
++        if not parsed:
++            raise TypeError('Unable to parse Number version string: '
++                            '{}'.format(data))
++        d = {}
++        for k, v in parsed.items():
++            d[cls._toPy.get(k, k)] = v
++
++        return cls(**d)
++
++    def serialize(self):
++        s = ""
++        if not self.tag:
++            s = "{}.{}.{}".format(self.major, self.minor, self.patch)
++        else:
++            s = "{}.{}-{}{}".format(self.major, self.minor, self.tag,
++                                    self.patch)
++        if self.build:
++            s = "{}.{}".format(s, self.build)
++        return s
++
++    def to_json(self):
++        return self.serialize()
++
++
++class Binary(_definitions.Binary):
++    """
++    This type represents a semver string with additional series and arch info.
++
++    Because it is not standard JSON, the typical from_json parsing fails and
++    the parsing must be handled specially.
++
++    See https://github.com/juju/version for more info.
++    """
++    binaryPat = re.compile(r'^(\d{1,9})\.(\d{1,9})(?:\.|-([a-z]+))(\d{1,9})(\.\d{1,9})?-([^-]+)-([^-]+)$')  # noqa
++
++    def __init__(self, number=None, series=None, arch=None, **unknown_fields):
++        '''
++        number : Number
++        series : str
++        arch : str
++        '''
++        self.number = Number.from_json(number)
++        self.series = series
++        self.arch = arch
++
++    def __repr__(self):
++        return '<Binary number={} series={} arch={}>'.format(
++            self.number, self.series, self.arch)
++
++    def __str__(self):
++        return self.serialize()
++
++    def __eq__(self, other):
++        return (
++            isinstance(other, type(self)) and
++            other.number == self.number and
++            other.series == self.series and
++            other.arch == self.arch)
++
++    @classmethod
++    def from_json(cls, data):
++        parsed = None
++        if isinstance(data, cls):
++            return data
++        elif data is None:
++            return cls()
++        elif isinstance(data, dict):
++            parsed = data
++        elif isinstance(data, str):
++            match = cls.binaryPat.match(data)
++            if match:
++                parsed = {
++                    'number': {
++                        'major': match.group(1),
++                        'minor': match.group(2),
++                        'tag': match.group(3),
++                        'patch': match.group(4),
++                        'build': (match.group(5)[1:] if match.group(5)
++                                  else 0),
++                    },
++                    'series': match.group(6),
++                    'arch': match.group(7),
++                }
++        if parsed is None:
++            raise TypeError('Unable to parse Binary version string: '
++                            '{}'.format(data))
++        d = {}
++        for k, v in parsed.items():
++            d[cls._toPy.get(k, k)] = v
++
++        return cls(**d)
++
++    def serialize(self):
++        return "{}-{}-{}".format(self.number.serialize(),
++                                 self.series, self.arch)
++
++    def to_json(self):
++        return self.serialize()
++
++
++class ConfigValue(_definitions.ConfigValue):
++    def __repr__(self):
++        return '<{} source={} value={}>'.format(type(self).__name__,
++                                                repr(self.source),
++                                                repr(self.value))
index 0000000,0000000..61f2963
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++
++
++
++class AsyncRunner:
++    async def __call__(self, facade_method, *args, **kwargs):
++        await self.connection.rpc(facade_method(*args, **kwargs))
++
++
++class ThreadedRunner:
++    pass
++
++# Methods are descriptors??
++# get is called with params
++# set gets called with the result?
++# This could let us fake the protocol we want
++# while decoupling the protocol from the RPC and the IO/Process context
++
++# The problem is leaking the runtime impl details to the top levels of the API with
++# async def
++# By handling the Marshal/Unmarshal side of RPC as a protocol we can leave the RPC running to a specific
++# delegate without altering the method signatures.
++# This still isn't quite right though as async is co-op multitasking and the methods still need to know
++# not to block or they will pause other execution
++
++
++
++
++
index 0000000,0000000..c53a541
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24533 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..69db493
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24799 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ApplicationRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "ApplicationRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationChange"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "ApplicationRelationsWatcherId": {
++              "type": "string"
++            },
++            "changes": {
++              "$ref": "#/definitions/ApplicationRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ApplicationRelationsWatcherId"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationChange": {
++          "type": "object",
++          "properties": {
++            "changedunits": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RelationUnitChange"
++                }
++              }
++            },
++            "departedunits": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..69db493
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24799 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ApplicationRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "ApplicationRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationChange"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "ApplicationRelationsWatcherId": {
++              "type": "string"
++            },
++            "changes": {
++              "$ref": "#/definitions/ApplicationRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ApplicationRelationsWatcherId"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationChange": {
++          "type": "object",
++          "properties": {
++            "changedunits": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RelationUnitChange"
++                }
++              }
++            },
++            "departedunits": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..69db493
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24799 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ApplicationRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "ApplicationRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationChange"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "ApplicationRelationsWatcherId": {
++              "type": "string"
++            },
++            "changes": {
++              "$ref": "#/definitions/ApplicationRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ApplicationRelationsWatcherId"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationChange": {
++          "type": "object",
++          "properties": {
++            "changedunits": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RelationUnitChange"
++                }
++              }
++            },
++            "departedunits": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..15f068f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25652 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteApplicationWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteApplicationChange": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "life",
++            "relations"
++          ]
++        },
++        "RemoteApplicationWatchResult": {
++          "type": "object",
++          "properties": {
++            "change": {
++              "$ref": "#/definitions/RemoteApplicationChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        },
++        "RemoteRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "RemoteRelationsWatcherId": {
++              "type": "string"
++            },
++            "change": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "RemoteRelationsWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..474b204
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25730 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteApplicationWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteApplicationChange": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "life",
++            "relations"
++          ]
++        },
++        "RemoteApplicationWatchResult": {
++          "type": "object",
++          "properties": {
++            "change": {
++              "$ref": "#/definitions/RemoteApplicationChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        },
++        "RemoteRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "RemoteRelationsWatcherId": {
++              "type": "string"
++            },
++            "change": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "RemoteRelationsWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..474b204
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25730 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "ip-addresses",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "migration": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EnvListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/EnvListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EnvListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "EnvListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteApplicationWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteApplicationChange": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "life",
++            "relations"
++          ]
++        },
++        "RemoteApplicationWatchResult": {
++          "type": "object",
++          "properties": {
++            "change": {
++              "$ref": "#/definitions/RemoteApplicationChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "RemoteRelationsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RemoteRelationsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RemoteEntityId": {
++          "type": "object",
++          "properties": {
++            "model-uuid": {
++              "type": "string"
++            },
++            "token": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-uuid",
++            "token"
++          ]
++        },
++        "RemoteRelationChange": {
++          "type": "object",
++          "properties": {
++            "changed-units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteRelationUnitChange"
++                }
++              }
++            },
++            "departed-units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life"
++          ]
++        },
++        "RemoteRelationUnitChange": {
++          "type": "object",
++          "properties": {
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "unit-id": {
++              "$ref": "#/definitions/RemoteEntityId"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-id"
++          ]
++        },
++        "RemoteRelationsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteRelationChange"
++              }
++            },
++            "initial": {
++              "type": "boolean"
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "initial"
++          ]
++        },
++        "RemoteRelationsWatchResult": {
++          "type": "object",
++          "properties": {
++            "RemoteRelationsWatcherId": {
++              "type": "string"
++            },
++            "change": {
++              "$ref": "#/definitions/RemoteRelationsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "RemoteRelationsWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..8fa5071
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25974 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Consume": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ConsumeApplicationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConsumeApplicationResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyApplication": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyApplicationResults"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyUnitResults"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationInfoResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationURLs": {
++          "type": "object",
++          "properties": {
++            "application-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "ConsumeApplicationArg": {
++          "type": "object",
++          "properties": {
++            "application-alias": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url"
++          ]
++        },
++        "ConsumeApplicationArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationArg"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "local-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "DestroyApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "DestroyUnitInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyUnitInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyUnitResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "application-url": {
++              "type": "string"
++            },
++            "description": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "icon-url-path": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "source-model-label": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "name",
++            "description",
++            "application-url",
++            "endpoints",
++            "icon-url-path"
++          ]
++        },
++        "RemoteApplicationInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RemoteApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RemoteApplicationInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteApplicationInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "network-interfaces": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInterface"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "model-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version",
++            "model-status"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NetworkInterface": {
++          "type": "object",
++          "properties": {
++            "dns-nameservers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway": {
++              "type": "string"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "is-up": {
++              "type": "boolean"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "space": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ip-addresses",
++            "mac-address",
++            "is-up"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "exclude": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta",
++            "exclude"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "DestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "ForceDestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachineInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyMachineInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyMachineResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PayloadListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "PayloadListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetPayloadStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpPayloadArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpPayloadArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetPayloadStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetPayloadStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetPayloadStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "Resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Attach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Detach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "FilesystemAttachmentInfo": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "FilesystemAttachmentInfo"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "VolumeAttachmentInfo": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "VolumeAttachmentInfo"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..9bd941b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26135 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Consume": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ConsumeApplicationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConsumeApplicationResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyApplication": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyApplicationResults"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyUnitResults"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationInfoResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationURLs": {
++          "type": "object",
++          "properties": {
++            "application-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "ConsumeApplicationArg": {
++          "type": "object",
++          "properties": {
++            "application-alias": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url"
++          ]
++        },
++        "ConsumeApplicationArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationArg"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "local-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "DestroyApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "DestroyUnitInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyUnitInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyUnitResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "application-url": {
++              "type": "string"
++            },
++            "description": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "icon-url-path": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "source-model-label": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "name",
++            "description",
++            "application-url",
++            "endpoints",
++            "icon-url-path"
++          ]
++        },
++        "RemoteApplicationInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RemoteApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RemoteApplicationInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteApplicationInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "network-interfaces": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInterface"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "level": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "creds"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "meter-status": {
++              "$ref": "#/definitions/MeterStatus"
++            },
++            "model-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version",
++            "model-status",
++            "meter-status"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NetworkInterface": {
++          "type": "object",
++          "properties": {
++            "dns-nameservers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway": {
++              "type": "string"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "is-up": {
++              "type": "boolean"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "space": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ip-addresses",
++            "mac-address",
++            "is-up"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "exclude": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta",
++            "exclude"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "DestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "ForceDestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachineInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyMachineInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyMachineResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddJujuMachineMetrics": {
++          "type": "object"
++        },
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "level": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "creds"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PayloadListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "PayloadListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetPayloadStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpPayloadArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpPayloadArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetPayloadStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetPayloadStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetPayloadStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListUnitResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListUnitResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "UnitResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "UnitResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Attach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Detach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "FilesystemAttachmentInfo": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "FilesystemAttachmentInfo"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "VolumeAttachmentInfo": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "VolumeAttachmentInfo"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 5,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..4b141fd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26150 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Consume": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ConsumeApplicationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConsumeApplicationResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyApplication": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyApplicationResults"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyUnitResults"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationInfoResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationURLs": {
++          "type": "object",
++          "properties": {
++            "application-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "ConsumeApplicationArg": {
++          "type": "object",
++          "properties": {
++            "application-alias": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url"
++          ]
++        },
++        "ConsumeApplicationArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationArg"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "local-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "DestroyApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "DestroyUnitInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyUnitInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyUnitResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "application-url": {
++              "type": "string"
++            },
++            "description": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "icon-url-path": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "source-model-label": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "name",
++            "description",
++            "application-url",
++            "endpoints",
++            "icon-url-path"
++          ]
++        },
++        "RemoteApplicationInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RemoteApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RemoteApplicationInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteApplicationInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "network-interfaces": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInterface"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "level": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "creds"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "meter-status": {
++              "$ref": "#/definitions/MeterStatus"
++            },
++            "model-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version",
++            "model-status",
++            "meter-status"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NetworkInterface": {
++          "type": "object",
++          "properties": {
++            "dns-nameservers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway": {
++              "type": "string"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "is-up": {
++              "type": "boolean"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "space": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ip-addresses",
++            "mac-address",
++            "is-up"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "exclude": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta",
++            "exclude"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "DestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "ForceDestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachineInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyMachineInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyMachineResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddJujuMachineMetrics": {
++          "type": "object"
++        },
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "external-control": {
++              "type": "boolean"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "skip-initial-prechecks": {
++              "type": "boolean"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info",
++            "external-control",
++            "skip-initial-prechecks"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "external-control": {
++              "type": "boolean"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "external-control",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "level": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "creds"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "provider-type",
++            "default-series",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "status",
++            "users",
++            "machines"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PayloadListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "PayloadListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetPayloadStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpPayloadArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpPayloadArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetPayloadStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetPayloadStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetPayloadStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListUnitResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListUnitResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "UnitResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "UnitResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Attach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Detach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "FilesystemAttachmentInfo": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "FilesystemAttachmentInfo"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "VolumeAttachmentInfo": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "VolumeAttachmentInfo"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 5,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnitsNetworkConfig"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitNetworkConfigResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchApplicationRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "binding-name": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "binding-name"
++          ]
++        },
++        "UnitNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "UnitNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "UnitsNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitNetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..17e841a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26295 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 4,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Consume": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ConsumeApplicationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConsumeApplicationResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyApplication": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyApplicationResults"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyUnitResults"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/RemoteApplicationInfoResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationURLs": {
++          "type": "object",
++          "properties": {
++            "application-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "ConsumeApplicationArg": {
++          "type": "object",
++          "properties": {
++            "application-alias": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url"
++          ]
++        },
++        "ConsumeApplicationArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationArg"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "local-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConsumeApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "DestroyApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "DestroyUnitInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyUnitInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyUnitResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "RemoteApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "application-url": {
++              "type": "string"
++            },
++            "description": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "icon-url-path": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "source-model-label": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "name",
++            "description",
++            "application-url",
++            "endpoints",
++            "icon-url-path"
++          ]
++        },
++        "RemoteApplicationInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RemoteApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RemoteApplicationInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteApplicationInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "network-interfaces": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInterface"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "sla": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "users",
++            "machines",
++            "sla",
++            "agent-version"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "ModelSLAInfo": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ModelSLAInfo",
++            "creds"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "meter-status": {
++              "$ref": "#/definitions/MeterStatus"
++            },
++            "model-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "sla": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version",
++            "model-status",
++            "meter-status",
++            "sla"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NetworkInterface": {
++          "type": "object",
++          "properties": {
++            "dns-nameservers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway": {
++              "type": "string"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "is-up": {
++              "type": "boolean"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "space": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ip-addresses",
++            "mac-address",
++            "is-up"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "exclude": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta",
++            "exclude"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiscoverSpaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DiscoverSpacesResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "DiscoverSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ProviderSpace": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider-id",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            },
++            "WWN": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "WWN",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "DestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "ForceDestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachineInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyMachineInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyMachineResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddJujuMachineMetrics": {
++          "type": "object"
++        },
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "ModelSLAInfo": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ModelSLAInfo",
++            "creds"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "sla": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "users",
++            "machines",
++            "sla",
++            "agent-version"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PayloadListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "PayloadListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetPayloadStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpPayloadArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpPayloadArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetPayloadStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetPayloadStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetPayloadStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "AutoNoProxy": {
++              "type": "string"
++            },
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy",
++            "AutoNoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListUnitResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListUnitResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "UnitResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "UnitResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Attach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Detach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "FilesystemAttachmentInfo": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "FilesystemAttachmentInfo"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "VolumeAttachmentInfo": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "VolumeAttachmentInfo"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            },
++            "WWN": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "WWN",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 5,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/NetworkInfoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/NetworkInfoResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InterfaceAddress": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "cidr"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkInfo": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InterfaceAddress"
++              }
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mac-address",
++            "interface-name",
++            "addresses"
++          ]
++        },
++        "NetworkInfoParams": {
++          "type": "object",
++          "properties": {
++            "bindings": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "bindings"
++          ]
++        },
++        "NetworkInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "network-info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "network-info"
++          ]
++        },
++        "NetworkInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInfoResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..e59c105
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26050 @@@
++[
++  {
++    "Name": "Action",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "ApplicationsCharmsActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationsCharmActionsResults"
++            }
++          }
++        },
++        "Cancel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "Enqueue": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Actions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "FindActionTagsByPrefix": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindTags"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindTagsResults"
++            }
++          }
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindActionsByNames"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByNames"
++            }
++          }
++        },
++        "ListAll": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListCompleted": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListPending": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "ListRunning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "Run": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "RunOnAllMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RunParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Action"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByName": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByNames": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByName"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationCharmActionsResult": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ActionSpec"
++                }
++              }
++            },
++            "application-tag": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ApplicationsCharmActionsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationCharmActionsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindActionsByNames": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FindTags": {
++          "type": "object",
++          "properties": {
++            "prefixes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "prefixes"
++          ]
++        },
++        "FindTagsResults": {
++          "type": "object",
++          "properties": {
++            "matches": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "$ref": "#/definitions/Entity"
++                  }
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "matches"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RunParams": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "commands": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "timeout": {
++              "type": "integer"
++            },
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "commands",
++            "timeout"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Agent",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetEntities": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AgentGetEntitiesResults"
++            }
++          }
++        },
++        "IsMaster": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/IsMasterResult"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StateServingInfo"
++            }
++          }
++        },
++        "WatchCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AgentGetEntitiesResult": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "jobs",
++            "container-type"
++          ]
++        },
++        "AgentGetEntitiesResults": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AgentGetEntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "IsMasterResult": {
++          "type": "object",
++          "properties": {
++            "master": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "master"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StateServingInfo": {
++          "type": "object",
++          "properties": {
++            "api-port": {
++              "type": "integer"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "cert": {
++              "type": "string"
++            },
++            "private-key": {
++              "type": "string"
++            },
++            "shared-secret": {
++              "type": "string"
++            },
++            "state-port": {
++              "type": "integer"
++            },
++            "system-identity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "api-port",
++            "state-port",
++            "cert",
++            "private-key",
++            "ca-private-key",
++            "shared-secret",
++            "system-identity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AgentTools",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateToolsAvailable": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllModelWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "AllWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherNextResults"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "AllWatcherNextResults": {
++          "type": "object",
++          "properties": {
++            "deltas": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Delta"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "deltas"
++          ]
++        },
++        "Delta": {
++          "type": "object",
++          "properties": {
++            "entity": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "removed": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "removed",
++            "entity"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Annotations",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/AnnotationsGetResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AnnotationsSet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AnnotationsGetResult": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "AnnotationsGetResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AnnotationsGetResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AnnotationsSet": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityAnnotations"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "annotations"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityAnnotations": {
++          "type": "object",
++          "properties": {
++            "annotations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "entity": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity",
++            "annotations"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Application",
++    "Version": 5,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddRelation"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddRelationResults"
++            }
++          }
++        },
++        "AddUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddApplicationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddApplicationUnitsResults"
++            }
++          }
++        },
++        "CharmRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationCharmRelations"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationCharmRelationsResults"
++            }
++          }
++        },
++        "Consume": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ConsumeApplicationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Deploy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationsDeploy"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationDestroy"
++            }
++          }
++        },
++        "DestroyApplication": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyApplicationResults"
++            }
++          }
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyRelation"
++            }
++          }
++        },
++        "DestroyUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyUnitResults"
++            }
++          }
++        },
++        "DestroyUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyApplicationUnits"
++            }
++          }
++        },
++        "Expose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationExpose"
++            }
++          }
++        },
++        "Get": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationGetResults"
++            }
++          }
++        },
++        "GetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationGet"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "GetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/GetApplicationConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "Set": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSet"
++            }
++          }
++        },
++        "SetCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationSetCharm"
++            }
++          }
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationMetricCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Unexpose": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnexpose"
++            }
++          }
++        },
++        "Unset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUnset"
++            }
++          }
++        },
++        "Update": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationUpdate"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "attach-storage": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "num-units",
++            "placement"
++          ]
++        },
++        "AddApplicationUnitsResults": {
++          "type": "object",
++          "properties": {
++            "units": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "units"
++          ]
++        },
++        "AddRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "AddRelationResults": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "ApplicationCharmRelations": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationCharmRelationsResults": {
++          "type": "object",
++          "properties": {
++            "charm-relations": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-relations"
++          ]
++        },
++        "ApplicationDeploy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "attach-storage": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-yaml": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "num-units": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Placement"
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Constraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "series",
++            "charm-url",
++            "channel",
++            "num-units",
++            "config-yaml",
++            "constraints"
++          ]
++        },
++        "ApplicationDestroy": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationExpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationGetResults": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm",
++            "config",
++            "constraints",
++            "series"
++          ]
++        },
++        "ApplicationMetricCredential": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "metrics-credentials": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "metrics-credentials"
++          ]
++        },
++        "ApplicationMetricCredentials": {
++          "type": "object",
++          "properties": {
++            "creds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationMetricCredential"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "creds"
++          ]
++        },
++        "ApplicationOffer": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "application-description": {
++              "type": "string"
++            },
++            "bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "offer-name": {
++              "type": "string"
++            },
++            "offer-url": {
++              "type": "string"
++            },
++            "source-model-tag": {
++              "type": "string"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteSpace"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "source-model-tag",
++            "offer-url",
++            "offer-name",
++            "application-description",
++            "endpoints",
++            "spaces",
++            "bindings",
++            "access"
++          ]
++        },
++        "ApplicationSet": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationSetCharm": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "channel": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "config-settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "config-settings-yaml": {
++              "type": "string"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "force-units": {
++              "type": "boolean"
++            },
++            "resource-ids": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "storage-constraints": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageConstraints"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "channel",
++            "force-units",
++            "force-series"
++          ]
++        },
++        "ApplicationUnexpose": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "ApplicationUnset": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "options": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "options"
++          ]
++        },
++        "ApplicationUpdate": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "charm-url": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "force-charm-url": {
++              "type": "boolean"
++            },
++            "force-series": {
++              "type": "boolean"
++            },
++            "min-units": {
++              "type": "integer"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "settings-yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "charm-url",
++            "force-charm-url",
++            "force-series",
++            "settings-yaml"
++          ]
++        },
++        "ApplicationsDeploy": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationDeploy"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "applications"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "ConsumeApplicationArg": {
++          "type": "object",
++          "properties": {
++            "ApplicationOffer": {
++              "$ref": "#/definitions/ApplicationOffer"
++            },
++            "application-alias": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ApplicationOffer"
++          ]
++        },
++        "ConsumeApplicationArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConsumeApplicationArg"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyApplicationInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyApplicationResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyApplicationUnits": {
++          "type": "object",
++          "properties": {
++            "unit-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-names"
++          ]
++        },
++        "DestroyRelation": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "endpoints"
++          ]
++        },
++        "DestroyUnitInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyUnitInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyUnitResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyUnitResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetApplicationConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "RemoteSpace": {
++          "type": "object",
++          "properties": {
++            "cloud-type": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider-attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-type",
++            "name",
++            "provider-id",
++            "provider-attributes",
++            "subnets"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ApplicationScaler",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Rescale": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Backups",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Create": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "FinishRestore": {
++          "type": "object"
++        },
++        "Info": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsInfoArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsMetadataResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/BackupsListResult"
++            }
++          }
++        },
++        "PrepareRestore": {
++          "type": "object"
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BackupsRemoveArgs"
++            }
++          }
++        },
++        "Restore": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RestoreArgs"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BackupsCreateArgs": {
++          "type": "object",
++          "properties": {
++            "notes": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "notes"
++          ]
++        },
++        "BackupsInfoArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "BackupsListArgs": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "BackupsListResult": {
++          "type": "object",
++          "properties": {
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BackupsMetadataResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "BackupsMetadataResult": {
++          "type": "object",
++          "properties": {
++            "ca-cert": {
++              "type": "string"
++            },
++            "ca-private-key": {
++              "type": "string"
++            },
++            "checksum": {
++              "type": "string"
++            },
++            "checksum-format": {
++              "type": "string"
++            },
++            "finished": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "hostname": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "model": {
++              "type": "string"
++            },
++            "notes": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "stored": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "checksum",
++            "checksum-format",
++            "size",
++            "stored",
++            "started",
++            "finished",
++            "notes",
++            "model",
++            "machine",
++            "hostname",
++            "version",
++            "series",
++            "ca-cert",
++            "ca-private-key"
++          ]
++        },
++        "BackupsRemoveArgs": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RestoreArgs": {
++          "type": "object",
++          "properties": {
++            "backup-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "backup-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Block",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BlockResults"
++            }
++          }
++        },
++        "SwitchBlockOff": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "SwitchBlockOn": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BlockSwitchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Block": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "tag",
++            "type"
++          ]
++        },
++        "BlockResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Block"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BlockSwitchParams": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Bundle",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "CharmRevisionUpdater",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "UpdateLatestRevisions": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Charms",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmInfo"
++            }
++          }
++        },
++        "IsMetered": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/IsMeteredResult"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmsList"
++            },
++            "Result": {
++              "$ref": "#/definitions/CharmsListResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmActionSpec": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "params": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "description",
++            "params"
++          ]
++        },
++        "CharmActions": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmActionSpec"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CharmInfo": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "$ref": "#/definitions/CharmActions"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmOption"
++                }
++              }
++            },
++            "meta": {
++              "$ref": "#/definitions/CharmMeta"
++            },
++            "metrics": {
++              "$ref": "#/definitions/CharmMetrics"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "url",
++            "config"
++          ]
++        },
++        "CharmMeta": {
++          "type": "object",
++          "properties": {
++            "categories": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "description": {
++              "type": "string"
++            },
++            "extra-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "min-juju-version": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "payload-classes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmPayloadClass"
++                }
++              }
++            },
++            "peers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "provides": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "requires": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmRelation"
++                }
++              }
++            },
++            "resources": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmResourceMeta"
++                }
++              }
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "storage": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmStorage"
++                }
++              }
++            },
++            "subordinate": {
++              "type": "boolean"
++            },
++            "summary": {
++              "type": "string"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "terms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "summary",
++            "description",
++            "subordinate"
++          ]
++        },
++        "CharmMetric": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "description"
++          ]
++        },
++        "CharmMetrics": {
++          "type": "object",
++          "properties": {
++            "metrics": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/CharmMetric"
++                }
++              }
++            },
++            "plan": {
++              "$ref": "#/definitions/CharmPlan"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metrics",
++            "plan"
++          ]
++        },
++        "CharmOption": {
++          "type": "object",
++          "properties": {
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "description": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CharmPayloadClass": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type"
++          ]
++        },
++        "CharmPlan": {
++          "type": "object",
++          "properties": {
++            "required": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "required"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmResourceMeta": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "description"
++          ]
++        },
++        "CharmStorage": {
++          "type": "object",
++          "properties": {
++            "count-max": {
++              "type": "integer"
++            },
++            "count-min": {
++              "type": "integer"
++            },
++            "description": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "minimum-size": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "properties": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "shared": {
++              "type": "boolean"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "description",
++            "type",
++            "shared",
++            "read-only",
++            "count-min",
++            "count-max",
++            "minimum-size"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmsList": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "names"
++          ]
++        },
++        "CharmsListResult": {
++          "type": "object",
++          "properties": {
++            "charm-urls": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm-urls"
++          ]
++        },
++        "IsMeteredResult": {
++          "type": "object",
++          "properties": {
++            "metered": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "metered"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cleaner",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cleanup": {
++          "type": "object"
++        },
++        "WatchCleanups": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Client",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "AbortCurrentUpgrade": {
++          "type": "object"
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharm"
++            }
++          }
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            }
++          }
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AddMachinesV2": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "AgentVersion": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AgentVersionResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyMachines"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FullStatus"
++            }
++          }
++        },
++        "GetBundleChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/BundleChangesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/BundleChangesResults"
++            }
++          }
++        },
++        "GetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/GetConstraintsResults"
++            }
++          }
++        },
++        "InjectMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelUserInfoResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PrivateAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PrivateAddressResults"
++            }
++          }
++        },
++        "ProvisioningScript": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ProvisioningScriptParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningScriptResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PublicAddress"
++            },
++            "Result": {
++              "$ref": "#/definitions/PublicAddressResults"
++            }
++          }
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResolveCharms"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolveCharmResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Resolved"
++            }
++          }
++        },
++        "RetryProvisioning": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelAgentVersion"
++            }
++          }
++        },
++        "SetModelConstraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetConstraints"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        },
++        "StatusHistory": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryRequests"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusHistoryResults"
++            }
++          }
++        },
++        "WatchAll": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "AddCharm": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel"
++          ]
++        },
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "AgentVersionResult": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "can-upgrade-to": {
++              "type": "string"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "exposed": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "meter-statuses": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MeterStatus"
++                }
++              }
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "subordinate-to": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "charm",
++            "series",
++            "exposed",
++            "life",
++            "relations",
++            "can-upgrade-to",
++            "subordinate-to",
++            "units",
++            "meter-statuses",
++            "status",
++            "workload-version"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BundleChange": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "type": "object",
++                "additionalProperties": true
++              }
++            },
++            "id": {
++              "type": "string"
++            },
++            "method": {
++              "type": "string"
++            },
++            "requires": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "method",
++            "args",
++            "requires"
++          ]
++        },
++        "BundleChangesParams": {
++          "type": "object",
++          "properties": {
++            "yaml": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "yaml"
++          ]
++        },
++        "BundleChangesResults": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BundleChange"
++              }
++            },
++            "errors": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachines": {
++          "type": "object",
++          "properties": {
++            "force": {
++              "type": "boolean"
++            },
++            "machine-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-names",
++            "force"
++          ]
++        },
++        "DetailedStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "info": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "data",
++            "since",
++            "kind",
++            "version",
++            "life"
++          ]
++        },
++        "EndpointStatus": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "subordinate": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "role",
++            "subordinate"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "FullStatus": {
++          "type": "object",
++          "properties": {
++            "applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ApplicationStatus"
++                }
++              }
++            },
++            "machines": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "model": {
++              "$ref": "#/definitions/ModelStatusInfo"
++            },
++            "relations": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationStatus"
++              }
++            },
++            "remote-applications": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/RemoteApplicationStatus"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "machines",
++            "applications",
++            "remote-applications",
++            "relations"
++          ]
++        },
++        "GetConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "History": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "statuses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DetailedStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statuses"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MachineStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "constraints": {
++              "type": "string"
++            },
++            "containers": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/MachineStatus"
++                }
++              }
++            },
++            "dns-name": {
++              "type": "string"
++            },
++            "hardware": {
++              "type": "string"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "instance-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "network-interfaces": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInterface"
++                }
++              }
++            },
++            "series": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "instance-status",
++            "dns-name",
++            "instance-id",
++            "series",
++            "id",
++            "containers",
++            "constraints",
++            "hardware",
++            "jobs",
++            "has-vote",
++            "wants-vote"
++          ]
++        },
++        "MeterStatus": {
++          "type": "object",
++          "properties": {
++            "color": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "color",
++            "message"
++          ]
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "sla": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "users",
++            "machines",
++            "sla",
++            "agent-version"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "ModelSLAInfo": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ModelSLAInfo",
++            "creds"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelStatusInfo": {
++          "type": "object",
++          "properties": {
++            "available-version": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "meter-status": {
++              "$ref": "#/definitions/MeterStatus"
++            },
++            "model-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "sla": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "cloud-tag",
++            "version",
++            "available-version",
++            "model-status",
++            "meter-status",
++            "sla"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModelUserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelUserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelUserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NetworkInterface": {
++          "type": "object",
++          "properties": {
++            "dns-nameservers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway": {
++              "type": "string"
++            },
++            "ip-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "is-up": {
++              "type": "boolean"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "space": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ip-addresses",
++            "mac-address",
++            "is-up"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PrivateAddressResults": {
++          "type": "object",
++          "properties": {
++            "private-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "private-address"
++          ]
++        },
++        "ProvisioningScriptParams": {
++          "type": "object",
++          "properties": {
++            "data-dir": {
++              "type": "string"
++            },
++            "disable-package-commands": {
++              "type": "boolean"
++            },
++            "machine-id": {
++              "type": "string"
++            },
++            "nonce": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-id",
++            "nonce",
++            "data-dir",
++            "disable-package-commands"
++          ]
++        },
++        "ProvisioningScriptResult": {
++          "type": "object",
++          "properties": {
++            "script": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "script"
++          ]
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "PublicAddressResults": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "public-address"
++          ]
++        },
++        "RelationStatus": {
++          "type": "object",
++          "properties": {
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EndpointStatus"
++              }
++            },
++            "id": {
++              "type": "integer"
++            },
++            "interface": {
++              "type": "string"
++            },
++            "key": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "key",
++            "interface",
++            "scope",
++            "endpoints"
++          ]
++        },
++        "RemoteApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "application-url": {
++              "type": "string"
++            },
++            "endpoints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RemoteEndpoint"
++              }
++            },
++            "err": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "life": {
++              "type": "string"
++            },
++            "relations": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/DetailedStatus"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-url",
++            "application-name",
++            "endpoints",
++            "life",
++            "relations",
++            "status"
++          ]
++        },
++        "RemoteEndpoint": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "limit",
++            "scope"
++          ]
++        },
++        "ResolveCharmResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ResolveCharmResults": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolveCharmResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ResolveCharms": {
++          "type": "object",
++          "properties": {
++            "references": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "references"
++          ]
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "retry": {
++              "type": "boolean"
++            },
++            "unit-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-name",
++            "retry"
++          ]
++        },
++        "SetConstraints": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "constraints"
++          ]
++        },
++        "SetModelAgentVersion": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "StatusHistoryFilter": {
++          "type": "object",
++          "properties": {
++            "date": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "delta": {
++              "type": "integer"
++            },
++            "exclude": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "size",
++            "date",
++            "delta",
++            "exclude"
++          ]
++        },
++        "StatusHistoryRequest": {
++          "type": "object",
++          "properties": {
++            "filter": {
++              "$ref": "#/definitions/StatusHistoryFilter"
++            },
++            "historyKind": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "historyKind",
++            "size",
++            "filter",
++            "tag"
++          ]
++        },
++        "StatusHistoryRequests": {
++          "type": "object",
++          "properties": {
++            "requests": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryRequest"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "requests"
++          ]
++        },
++        "StatusHistoryResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "history": {
++              "$ref": "#/definitions/History"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "history"
++          ]
++        },
++        "StatusHistoryResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusHistoryResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusParams": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "agent-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "charm": {
++              "type": "string"
++            },
++            "leader": {
++              "type": "boolean"
++            },
++            "machine": {
++              "type": "string"
++            },
++            "opened-ports": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "public-address": {
++              "type": "string"
++            },
++            "subordinates": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitStatus"
++                }
++              }
++            },
++            "workload-status": {
++              "$ref": "#/definitions/DetailedStatus"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-status",
++            "workload-status",
++            "workload-version",
++            "machine",
++            "opened-ports",
++            "public-address",
++            "charm",
++            "subordinates"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Cloud",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudResults"
++            }
++          }
++        },
++        "Clouds": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/CloudsResult"
++            }
++          }
++        },
++        "Credential": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudCredentialResults"
++            }
++          }
++        },
++        "DefaultCloud": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CloudInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        },
++        "RevokeCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpdateCloudCredentials"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserCredentials": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserClouds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Cloud": {
++          "type": "object",
++          "properties": {
++            "auth-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudRegion"
++              }
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudCredentialResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudCredential"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudCredentialResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudCredentialResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cloud-tag",
++            "region"
++          ]
++        },
++        "CloudInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "CloudRegion": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name"
++          ]
++        },
++        "CloudResult": {
++          "type": "object",
++          "properties": {
++            "cloud": {
++              "$ref": "#/definitions/Cloud"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudsResult": {
++          "type": "object",
++          "properties": {
++            "clouds": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/Cloud"
++                }
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateCloudCredential": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "credential"
++          ]
++        },
++        "UpdateCloudCredentials": {
++          "type": "object",
++          "properties": {
++            "credentials": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UpdateCloudCredential"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserCloud": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "cloud-tag"
++          ]
++        },
++        "UserClouds": {
++          "type": "object",
++          "properties": {
++            "user-clouds": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserCloud"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Controller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DestroyController": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DestroyControllerArgs"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserAccessResults"
++            }
++          }
++        },
++        "HostedModelConfigs": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/HostedModelConfigsResults"
++            }
++          }
++        },
++        "InitiateMigration": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InitiateMigrationArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/InitiateMigrationResults"
++            }
++          }
++        },
++        "ListBlockedModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelBlockInfoList"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyControllerAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveBlocks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RemoveBlocksArgs"
++            }
++          }
++        },
++        "WatchAllModels": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/AllWatcherId"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AllWatcherId": {
++          "type": "object",
++          "properties": {
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DestroyControllerArgs": {
++          "type": "object",
++          "properties": {
++            "destroy-models": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destroy-models"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostedModelConfig": {
++          "type": "object",
++          "properties": {
++            "cloud-spec": {
++              "$ref": "#/definitions/CloudSpec"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner"
++          ]
++        },
++        "HostedModelConfigsResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostedModelConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "InitiateMigrationArgs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MigrationSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "InitiateMigrationResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "migration-id"
++          ]
++        },
++        "InitiateMigrationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InitiateMigrationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelBlockInfo": {
++          "type": "object",
++          "properties": {
++            "blocks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "model-uuid": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "model-uuid",
++            "owner-tag",
++            "blocks"
++          ]
++        },
++        "ModelBlockInfoList": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelBlockInfo"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyControllerAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access"
++          ]
++        },
++        "ModifyControllerAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyControllerAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "RemoveBlocksArgs": {
++          "type": "object",
++          "properties": {
++            "all": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "all"
++          ]
++        },
++        "UserAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "access"
++          ]
++        },
++        "UserAccessResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserAccess"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserAccessResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserAccessResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Deployer",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "ConnectionInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/DeployerConnectionValues"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DeployerConnectionValues": {
++          "type": "object",
++          "properties": {
++            "api-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "state-addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "state-addresses",
++            "api-addresses"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "DiskManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineBlockDevices"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            },
++            "WWN": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "WWN",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDevice"
++              }
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "SetMachineBlockDevices": {
++          "type": "object",
++          "properties": {
++            "machine-block-devices": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineBlockDevices"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-block-devices"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "EntityWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/EntitiesWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "EntitiesWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "FilesystemAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Firewaller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResults"
++            }
++          }
++        },
++        "GetAssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "GetCloudSpec": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/CloudSpecResult"
++            }
++          }
++        },
++        "GetExposed": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "GetMachineActiveSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "GetMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachinePortsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "WatchOpenedPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "CloudCredential": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "auth-type": {
++              "type": "string"
++            },
++            "redacted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "auth-type"
++          ]
++        },
++        "CloudSpec": {
++          "type": "object",
++          "properties": {
++            "credential": {
++              "$ref": "#/definitions/CloudCredential"
++            },
++            "endpoint": {
++              "type": "string"
++            },
++            "identity-endpoint": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            },
++            "storage-endpoint": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type",
++            "name"
++          ]
++        },
++        "CloudSpecResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/CloudSpec"
++            }
++          },
++          "additionalProperties": false
++        },
++        "CloudSpecResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudSpecResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePorts": {
++          "type": "object",
++          "properties": {
++            "machine-tag": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "subnet-tag"
++          ]
++        },
++        "MachinePortsParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePorts"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelTag": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "HighAvailability",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "EnableHA": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ControllersSpecs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ControllersChangeResults"
++            }
++          }
++        },
++        "ResumeHAReplicationAfterUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ResumeReplicationParams"
++            }
++          }
++        },
++        "StopHAReplicationForUpgrade": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UpgradeMongoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/MongoUpgradeResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "Scope": {
++              "type": "string"
++            },
++            "SpaceName": {
++              "type": "string"
++            },
++            "SpaceProviderId": {
++              "type": "string"
++            },
++            "Type": {
++              "type": "string"
++            },
++            "Value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Value",
++            "Type",
++            "Scope",
++            "SpaceName",
++            "SpaceProviderId"
++          ]
++        },
++        "ControllersChangeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ControllersChanges"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ControllersChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersChangeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ControllersChanges": {
++          "type": "object",
++          "properties": {
++            "added": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "converted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "demoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "maintained": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "promoted": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "removed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ControllersSpec": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "num-controllers": {
++              "type": "integer"
++            },
++            "placement": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "num-controllers"
++          ]
++        },
++        "ControllersSpecs": {
++          "type": "object",
++          "properties": {
++            "specs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ControllersSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "specs"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HAMember": {
++          "type": "object",
++          "properties": {
++            "public-address": {
++              "$ref": "#/definitions/Address"
++            },
++            "series": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-address",
++            "series"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Member": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "type": "string"
++            },
++            "Arbiter": {
++              "type": "boolean"
++            },
++            "BuildIndexes": {
++              "type": "boolean"
++            },
++            "Hidden": {
++              "type": "boolean"
++            },
++            "Id": {
++              "type": "integer"
++            },
++            "Priority": {
++              "type": "number"
++            },
++            "SlaveDelay": {
++              "type": "integer"
++            },
++            "Tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "Votes": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Id",
++            "Address",
++            "Arbiter",
++            "BuildIndexes",
++            "Hidden",
++            "Priority",
++            "Tags",
++            "SlaveDelay",
++            "Votes"
++          ]
++        },
++        "MongoUpgradeResults": {
++          "type": "object",
++          "properties": {
++            "ha-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HAMember"
++              }
++            },
++            "master": {
++              "$ref": "#/definitions/HAMember"
++            },
++            "rs-members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "rs-members",
++            "master",
++            "ha-members"
++          ]
++        },
++        "MongoVersion": {
++          "type": "object",
++          "properties": {
++            "engine": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "patch": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "major",
++            "minor",
++            "patch",
++            "engine"
++          ]
++        },
++        "ResumeReplicationParams": {
++          "type": "object",
++          "properties": {
++            "members": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Member"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "members"
++          ]
++        },
++        "UpgradeMongoParams": {
++          "type": "object",
++          "properties": {
++            "target": {
++              "$ref": "#/definitions/MongoVersion"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "target"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "HostKeyReporter",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ReportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SSHHostKeySet"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHHostKeySet": {
++          "type": "object",
++          "properties": {
++            "entity-keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHHostKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entity-keys"
++          ]
++        },
++        "SSHHostKeys": {
++          "type": "object",
++          "properties": {
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "public-keys"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageManager",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DeleteImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListImages": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageFilterParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListImageResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageFilterParams": {
++          "type": "object",
++          "properties": {
++            "images": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageSpec"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "images"
++          ]
++        },
++        "ImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series",
++            "url",
++            "created"
++          ]
++        },
++        "ImageSpec": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "kind": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "kind",
++            "arch",
++            "series"
++          ]
++        },
++        "ListImageResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "ImageMetadata",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Delete": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataImageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ImageMetadataFilter"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListCloudImageMetadataResult"
++            }
++          }
++        },
++        "Save": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetadataSaveParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateFromPublishedImages": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "CloudImageMetadataList": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ImageMetadataFilter": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "stream": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListCloudImageMetadataResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MetadataImageIds": {
++          "type": "object",
++          "properties": {
++            "image-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-ids"
++          ]
++        },
++        "MetadataSaveParams": {
++          "type": "object",
++          "properties": {
++            "metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadataList"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "InstancePoller",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AreManuallyProvisioned": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineAddressesResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "MachineAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "MachineAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DeleteKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ImportKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyUserSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListSSHKeys"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSSHKeys": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "$ref": "#/definitions/Entities"
++            },
++            "mode": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "mode"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModifyUserSSHKeys": {
++          "type": "object",
++          "properties": {
++            "ssh-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "ssh-keys"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "KeyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "WatchAuthorisedKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LeadershipService",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "BlockUntilLeadershipReleased": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ApplicationTag"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResult"
++            }
++          }
++        },
++        "ClaimLeadership": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ClaimLeadershipBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ClaimLeadershipBulkResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ApplicationTag": {
++          "type": "object",
++          "properties": {
++            "Name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Name"
++          ]
++        },
++        "ClaimLeadershipBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ClaimLeadershipParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "ClaimLeadershipBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ClaimLeadershipParams": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "number"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "unit-tag",
++            "duration"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "LifeFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "LogForwarding",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingGetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/LogForwardingGetLastSentResults"
++            }
++          }
++        },
++        "SetLastSent": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LogForwardingSetLastSentParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingGetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingID"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "LogForwardingGetLastSentResult": {
++          "type": "object",
++          "properties": {
++            "err": {
++              "$ref": "#/definitions/Error"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "record-id",
++            "record-timestamp",
++            "err"
++          ]
++        },
++        "LogForwardingGetLastSentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingGetLastSentResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LogForwardingID": {
++          "type": "object",
++          "properties": {
++            "model": {
++              "type": "string"
++            },
++            "sink": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "sink"
++          ]
++        },
++        "LogForwardingSetLastSentParam": {
++          "type": "object",
++          "properties": {
++            "LogForwardingID": {
++              "$ref": "#/definitions/LogForwardingID"
++            },
++            "record-id": {
++              "type": "integer"
++            },
++            "record-timestamp": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "LogForwardingID",
++            "record-id",
++            "record-timestamp"
++          ]
++        },
++        "LogForwardingSetLastSentParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LogForwardingSetLastSentParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "Logger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "LoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "WatchLoggingConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineActions",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RunningActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionsByReceivers"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceiver": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "receiver": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionsByReceivers": {
++          "type": "object",
++          "properties": {
++            "actions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionsByReceiver"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddMachines"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddMachinesResults"
++            }
++          }
++        },
++        "DestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "ForceDestroyMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DestroyMachineResults"
++            }
++          }
++        },
++        "InstanceTypes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelInstanceTypesConstraints"
++            },
++            "Result": {
++              "$ref": "#/definitions/InstanceTypesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddMachineParams": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "container-type": {
++              "type": "string"
++            },
++            "disks": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Constraints"
++              }
++            },
++            "hardware-characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "parent-id": {
++              "type": "string"
++            },
++            "placement": {
++              "$ref": "#/definitions/Placement"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "series",
++            "constraints",
++            "jobs",
++            "parent-id",
++            "container-type",
++            "instance-id",
++            "nonce",
++            "hardware-characteristics",
++            "addresses"
++          ]
++        },
++        "AddMachines": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachineParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "AddMachinesResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "machine": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine"
++          ]
++        },
++        "AddMachinesResults": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddMachinesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Count": {
++              "type": "integer"
++            },
++            "Pool": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Pool",
++            "Size",
++            "Count"
++          ]
++        },
++        "DestroyMachineInfo": {
++          "type": "object",
++          "properties": {
++            "destroyed-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "destroyed-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "detached-storage": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "$ref": "#/definitions/DestroyMachineInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "DestroyMachineResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DestroyMachineResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceType": {
++          "type": "object",
++          "properties": {
++            "arches": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "cost": {
++              "type": "integer"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "deprecated": {
++              "type": "boolean"
++            },
++            "memory": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "arches",
++            "cpu-cores",
++            "memory"
++          ]
++        },
++        "InstanceTypesResult": {
++          "type": "object",
++          "properties": {
++            "cost-currency": {
++              "type": "string"
++            },
++            "cost-divisor": {
++              "type": "integer"
++            },
++            "cost-unit": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "instance-types": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceType"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "InstanceTypesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceTypesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraint": {
++          "type": "object",
++          "properties": {
++            "value": {
++              "$ref": "#/definitions/Value"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInstanceTypesConstraints": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInstanceTypesConstraint"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "Placement": {
++          "type": "object",
++          "properties": {
++            "directive": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "scope",
++            "directive"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MachineUndertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/EntitiesResults"
++            }
++          }
++        },
++        "CompleteMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            }
++          }
++        },
++        "GetMachineProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProviderInterfaceInfoResults"
++            }
++          }
++        },
++        "WatchMachineRemovals": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResult": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntitiesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProviderInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "interface-name",
++            "mac-address",
++            "provider-id"
++          ]
++        },
++        "ProviderInterfaceInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "interfaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfo"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "interfaces"
++          ]
++        },
++        "ProviderInterfaceInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProviderInterfaceInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Machiner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Jobs": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/JobsResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetMachineAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachinesAddresses"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "JobsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "jobs"
++          ]
++        },
++        "JobsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/JobsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineAddresses": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Address"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "addresses"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetMachinesAddresses": {
++          "type": "object",
++          "properties": {
++            "machine-addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineAddresses"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-addresses"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MeterStatus",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsAdder",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsDebug",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MetricResults"
++            }
++          }
++        },
++        "SetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MeterStatusParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityMetrics": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MeterStatusParam": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusParams": {
++          "type": "object",
++          "properties": {
++            "statues": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "statues"
++          ]
++        },
++        "MetricResult": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "unit": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "time",
++            "key",
++            "value",
++            "unit"
++          ]
++        },
++        "MetricResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityMetrics"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MetricsManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddJujuMachineMetrics": {
++          "type": "object"
++        },
++        "CleanupOldMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SendMetrics": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationFlag",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Phase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PhaseResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PhaseResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "PhaseResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PhaseResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMaster",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Export": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MasterMigrationStatus"
++            }
++          }
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MinionReports"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object"
++        },
++        "Reap": {
++          "type": "object"
++        },
++        "SetPhase": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationPhaseArgs"
++            }
++          }
++        },
++        "SetStatusMessage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMigrationStatusMessageArgs"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMinionReports": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MasterMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "phase-changed-time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "spec": {
++              "$ref": "#/definitions/MigrationSpec"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spec",
++            "migration-id",
++            "phase",
++            "phase-changed-time"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "MigrationSpec": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "target-info": {
++              "$ref": "#/definitions/MigrationTargetInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "target-info"
++          ]
++        },
++        "MigrationTargetInfo": {
++          "type": "object",
++          "properties": {
++            "addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "auth-tag": {
++              "type": "string"
++            },
++            "ca-cert": {
++              "type": "string"
++            },
++            "controller-tag": {
++              "type": "string"
++            },
++            "macaroons": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "controller-tag",
++            "addrs",
++            "ca-cert",
++            "auth-tag"
++          ]
++        },
++        "MinionReports": {
++          "type": "object",
++          "properties": {
++            "failed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success-count": {
++              "type": "integer"
++            },
++            "unknown-count": {
++              "type": "integer"
++            },
++            "unknown-sample": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success-count",
++            "unknown-count",
++            "unknown-sample",
++            "failed"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        },
++        "SetMigrationPhaseArgs": {
++          "type": "object",
++          "properties": {
++            "phase": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "phase"
++          ]
++        },
++        "SetMigrationStatusMessageArgs": {
++          "type": "object",
++          "properties": {
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationMinion",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Report": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MinionReport"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MinionReport": {
++          "type": "object",
++          "properties": {
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "success": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "phase",
++            "success"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationStatusWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MigrationStatus"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "MigrationStatus": {
++          "type": "object",
++          "properties": {
++            "attempt": {
++              "type": "integer"
++            },
++            "migration-id": {
++              "type": "string"
++            },
++            "phase": {
++              "type": "string"
++            },
++            "source-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "source-ca-cert": {
++              "type": "string"
++            },
++            "target-api-addrs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "target-ca-cert": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "migration-id",
++            "attempt",
++            "phase",
++            "source-api-addrs",
++            "source-ca-cert",
++            "target-api-addrs",
++            "target-ca-cert"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "MigrationTarget",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Abort": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "Activate": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            }
++          }
++        },
++        "AdoptResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AdoptResourcesArgs"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Import": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SerializedModel"
++            }
++          }
++        },
++        "LatestLogTime": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelArgs"
++            },
++            "Result": {
++              "type": "string",
++              "format": "date-time"
++            }
++          }
++        },
++        "Prechecks": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MigrationModelInfo"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AdoptResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            },
++            "source-controller-version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "source-controller-version"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MigrationModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "controller-agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "owner-tag",
++            "agent-version",
++            "controller-agent-version"
++          ]
++        },
++        "ModelArgs": {
++          "type": "object",
++          "properties": {
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "SerializedModel": {
++          "type": "object",
++          "properties": {
++            "bytes": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "charms": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelResource"
++              }
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SerializedModelTools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "bytes",
++            "charms",
++            "tools",
++            "resources"
++          ]
++        },
++        "SerializedModelResource": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "type": "string"
++            },
++            "application-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "charmstore-revision": {
++              "$ref": "#/definitions/SerializedModelResourceRevision"
++            },
++            "name": {
++              "type": "string"
++            },
++            "unit-revisions": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/SerializedModelResourceRevision"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "name",
++            "application-revision",
++            "charmstore-revision",
++            "unit-revisions"
++          ]
++        },
++        "SerializedModelResourceRevision": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "type": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "revision",
++            "type",
++            "path",
++            "description",
++            "origin",
++            "fingerprint",
++            "size",
++            "timestamp"
++          ]
++        },
++        "SerializedModelTools": {
++          "type": "object",
++          "properties": {
++            "uri": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "uri"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelConfig",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelGet": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResults"
++            }
++          }
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSet"
++            }
++          }
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelUnset"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetSLALevel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelSLA"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "ConfigValue": {
++          "type": "object",
++          "properties": {
++            "source": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "source"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ConfigValue"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelSLA": {
++          "type": "object",
++          "properties": {
++            "ModelSLAInfo": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "creds": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ModelSLAInfo",
++            "creds"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelSet": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelUnset": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ModelManager",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateModel": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModelCreateArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          }
++        },
++        "DestroyModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DumpModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/DumpModelRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "DumpModelsDB": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MapResults"
++            }
++          }
++        },
++        "ListModels": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entity"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserModelList"
++            }
++          }
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelDefaultsResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelInfoResults"
++            }
++          }
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ModelStatusResults"
++            }
++          }
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ModifyModelAccessRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UnsetModelDefaults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "DumpModelRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "simplified": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "simplified"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineHardware": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "MapResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "MapResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MapResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Model": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "owner-tag"
++          ]
++        },
++        "ModelCreateArgs": {
++          "type": "object",
++          "properties": {
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "credential": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "region": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "owner-tag"
++          ]
++        },
++        "ModelDefaultValues": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelDefaults": {
++          "type": "object",
++          "properties": {
++            "controller": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "default": {
++              "type": "object",
++              "additionalProperties": true
++            },
++            "regions": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RegionDefaults"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelDefaultsResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/ModelDefaults"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "agent-version": {
++              "$ref": "#/definitions/Number"
++            },
++            "cloud-credential-tag": {
++              "type": "string"
++            },
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "controller-uuid": {
++              "type": "string"
++            },
++            "default-series": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "migration": {
++              "$ref": "#/definitions/ModelMigrationStatus"
++            },
++            "name": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "sla": {
++              "$ref": "#/definitions/ModelSLAInfo"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUserInfo"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid",
++            "controller-uuid",
++            "cloud-tag",
++            "owner-tag",
++            "life",
++            "users",
++            "machines",
++            "sla",
++            "agent-version"
++          ]
++        },
++        "ModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ModelInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ModelInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelMachineInfo": {
++          "type": "object",
++          "properties": {
++            "hardware": {
++              "$ref": "#/definitions/MachineHardware"
++            },
++            "has-vote": {
++              "type": "boolean"
++            },
++            "id": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "wants-vote": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id"
++          ]
++        },
++        "ModelMigrationStatus": {
++          "type": "object",
++          "properties": {
++            "end": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "start": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "start"
++          ]
++        },
++        "ModelSLAInfo": {
++          "type": "object",
++          "properties": {
++            "level": {
++              "type": "string"
++            },
++            "owner": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "level",
++            "owner"
++          ]
++        },
++        "ModelStatus": {
++          "type": "object",
++          "properties": {
++            "application-count": {
++              "type": "integer"
++            },
++            "hosted-machine-count": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelMachineInfo"
++              }
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "life",
++            "hosted-machine-count",
++            "application-count",
++            "owner-tag"
++          ]
++        },
++        "ModelStatusResults": {
++          "type": "object",
++          "properties": {
++            "models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelStatus"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "models"
++          ]
++        },
++        "ModelUnsetKeys": {
++          "type": "object",
++          "properties": {
++            "cloud-region": {
++              "type": "string"
++            },
++            "cloud-tag": {
++              "type": "string"
++            },
++            "keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "ModelUserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "user": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user",
++            "display-name",
++            "last-connection",
++            "access"
++          ]
++        },
++        "ModifyModelAccess": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "action": {
++              "type": "string"
++            },
++            "model-tag": {
++              "type": "string"
++            },
++            "user-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-tag",
++            "action",
++            "access",
++            "model-tag"
++          ]
++        },
++        "ModifyModelAccessRequest": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModifyModelAccess"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "RegionDefaults": {
++          "type": "object",
++          "properties": {
++            "region-name": {
++              "type": "string"
++            },
++            "value": {
++              "type": "object",
++              "additionalProperties": true
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "region-name",
++            "value"
++          ]
++        },
++        "SetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelDefaultValues"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnsetModelDefaults": {
++          "type": "object",
++          "properties": {
++            "keys": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ModelUnsetKeys"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "keys"
++          ]
++        },
++        "UserModel": {
++          "type": "object",
++          "properties": {
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "model": {
++              "$ref": "#/definitions/Model"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model",
++            "last-connection"
++          ]
++        },
++        "UserModelList": {
++          "type": "object",
++          "properties": {
++            "user-models": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserModel"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "user-models"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "NotifyWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Payloads",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/PayloadListArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadListResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadListArgs": {
++          "type": "object",
++          "properties": {
++            "patterns": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "patterns"
++          ]
++        },
++        "PayloadListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "PayloadsHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "List": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "LookUp": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/LookUpPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetPayloadStatusArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Track": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/TrackPayloadArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        },
++        "Untrack": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/PayloadResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "LookUpPayloadArg": {
++          "type": "object",
++          "properties": {
++            "id": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "id"
++          ]
++        },
++        "LookUpPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LookUpPayloadArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Payload": {
++          "type": "object",
++          "properties": {
++            "class": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "labels": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "class",
++            "type",
++            "id",
++            "status",
++            "labels",
++            "unit",
++            "machine"
++          ]
++        },
++        "PayloadResult": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "not-found": {
++              "type": "boolean"
++            },
++            "payload": {
++              "$ref": "#/definitions/Payload"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "payload",
++            "not-found"
++          ]
++        },
++        "PayloadResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/PayloadResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetPayloadStatusArg": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "status"
++          ]
++        },
++        "SetPayloadStatusArgs": {
++          "type": "object",
++          "properties": {
++            "args": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SetPayloadStatusArg"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "args"
++          ]
++        },
++        "TrackPayloadArgs": {
++          "type": "object",
++          "properties": {
++            "payloads": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Payload"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "payloads"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Pinger",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Ping": {
++          "type": "object"
++        },
++        "Stop": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "Provisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "Constraints": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConstraintsResults"
++            }
++          }
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ContainerConfig"
++            }
++          }
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ContainerManagerConfigParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ContainerManagerConfig"
++            }
++          }
++        },
++        "ControllerConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ControllerConfigResult"
++            }
++          }
++        },
++        "DistributionGroup": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/DistributionGroupResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FindTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FindToolsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/FindToolsResult"
++            }
++          }
++        },
++        "GetContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "HostChangesForContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/HostNetworkChangeResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "InstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "MachinesWithTransientErrors": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "MarkMachinesForRemoval": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PrepareContainerInterfaceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineNetworkConfigResults"
++            }
++          }
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProvisioningInfoResults"
++            }
++          }
++        },
++        "ReleaseContainerAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Series": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "SetHostMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetInstanceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/InstancesInfo"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetInstanceStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetObservedNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetMachineNetworkConfig"
++            }
++          }
++        },
++        "SetPasswords": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetProviderNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetSupportedContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineContainersParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StateAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "Status": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchAllContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/WatchContainers"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchMachineErrorRetry": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchModelMachines": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CloudImageMetadata": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "image-id": {
++              "type": "string"
++            },
++            "priority": {
++              "type": "integer"
++            },
++            "region": {
++              "type": "string"
++            },
++            "root-storage-size": {
++              "type": "integer"
++            },
++            "root-storage-type": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "source": {
++              "type": "string"
++            },
++            "stream": {
++              "type": "string"
++            },
++            "version": {
++              "type": "string"
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "image-id",
++            "region",
++            "version",
++            "series",
++            "arch",
++            "source",
++            "priority"
++          ]
++        },
++        "ConstraintsResult": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints"
++          ]
++        },
++        "ConstraintsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConstraintsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ContainerConfig": {
++          "type": "object",
++          "properties": {
++            "UpdateBehavior": {
++              "$ref": "#/definitions/UpdateBehavior"
++            },
++            "apt-mirror": {
++              "type": "string"
++            },
++            "apt-proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "authorized-keys": {
++              "type": "string"
++            },
++            "provider-type": {
++              "type": "string"
++            },
++            "proxy": {
++              "$ref": "#/definitions/Settings"
++            },
++            "ssl-hostname-verification": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "provider-type",
++            "authorized-keys",
++            "ssl-hostname-verification",
++            "proxy",
++            "apt-proxy",
++            "apt-mirror",
++            "UpdateBehavior"
++          ]
++        },
++        "ContainerManagerConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ContainerManagerConfigParams": {
++          "type": "object",
++          "properties": {
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "type"
++          ]
++        },
++        "ControllerConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "DeviceBridgeInfo": {
++          "type": "object",
++          "properties": {
++            "bridge-name": {
++              "type": "string"
++            },
++            "host-device-name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "host-device-name",
++            "bridge-name"
++          ]
++        },
++        "DistributionGroupResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "DistributionGroupResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DistributionGroupResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FindToolsParams": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "major": {
++              "type": "integer"
++            },
++            "minor": {
++              "type": "integer"
++            },
++            "number": {
++              "$ref": "#/definitions/Number"
++            },
++            "series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "number",
++            "major",
++            "minor",
++            "arch",
++            "series"
++          ]
++        },
++        "FindToolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "list": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "list"
++          ]
++        },
++        "HardwareCharacteristics": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "availability-zone": {
++              "type": "string"
++            },
++            "cpu-cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "HostNetworkChange": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "new-bridges": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/DeviceBridgeInfo"
++              }
++            },
++            "reconfigure-delay": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "new-bridges",
++            "reconfigure-delay"
++          ]
++        },
++        "HostNetworkChangeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/HostNetworkChange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "InstanceInfo": {
++          "type": "object",
++          "properties": {
++            "characteristics": {
++              "$ref": "#/definitions/HardwareCharacteristics"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "network-config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "nonce": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "volume-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentInfo"
++                }
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "instance-id",
++            "nonce",
++            "characteristics",
++            "volumes",
++            "volume-attachments",
++            "network-config"
++          ]
++        },
++        "InstancesInfo": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InstanceInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machines"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineContainers": {
++          "type": "object",
++          "properties": {
++            "container-types": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-types"
++          ]
++        },
++        "MachineContainersParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineContainers"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MachineNetworkConfigResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "info"
++          ]
++        },
++        "MachineNetworkConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineNetworkConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NetworkConfig": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "cidr": {
++              "type": "string"
++            },
++            "config-type": {
++              "type": "string"
++            },
++            "device-index": {
++              "type": "integer"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "dns-search-domains": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "dns-servers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "gateway-address": {
++              "type": "string"
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "interface-type": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            },
++            "mtu": {
++              "type": "integer"
++            },
++            "no-auto-start": {
++              "type": "boolean"
++            },
++            "parent-interface-name": {
++              "type": "string"
++            },
++            "provider-address-id": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "provider-subnet-id": {
++              "type": "string"
++            },
++            "provider-vlan-id": {
++              "type": "string"
++            },
++            "routes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkRoute"
++              }
++            },
++            "vlan-tag": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "device-index",
++            "mac-address",
++            "cidr",
++            "mtu",
++            "provider-id",
++            "provider-subnet-id",
++            "provider-space-id",
++            "provider-address-id",
++            "provider-vlan-id",
++            "vlan-tag",
++            "interface-name",
++            "parent-interface-name",
++            "interface-type",
++            "disabled"
++          ]
++        },
++        "NetworkRoute": {
++          "type": "object",
++          "properties": {
++            "destination-cidr": {
++              "type": "string"
++            },
++            "gateway-ip": {
++              "type": "string"
++            },
++            "metric": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "destination-cidr",
++            "gateway-ip",
++            "metric"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "ProvisioningInfo": {
++          "type": "object",
++          "properties": {
++            "constraints": {
++              "$ref": "#/definitions/Value"
++            },
++            "controller-config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "endpoint-bindings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "image-metadata": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CloudImageMetadata"
++              }
++            },
++            "jobs": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "placement": {
++              "type": "string"
++            },
++            "series": {
++              "type": "string"
++            },
++            "subnets-to-zones": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "array",
++                  "items": {
++                    "type": "string"
++                  }
++                }
++              }
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParams"
++              }
++            },
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "constraints",
++            "series",
++            "placement",
++            "jobs"
++          ]
++        },
++        "ProvisioningInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/ProvisioningInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "ProvisioningInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProvisioningInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetMachineNetworkConfig": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkConfig"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "config"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Settings": {
++          "type": "object",
++          "properties": {
++            "AutoNoProxy": {
++              "type": "string"
++            },
++            "Ftp": {
++              "type": "string"
++            },
++            "Http": {
++              "type": "string"
++            },
++            "Https": {
++              "type": "string"
++            },
++            "NoProxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Http",
++            "Https",
++            "Ftp",
++            "NoProxy",
++            "AutoNoProxy"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UpdateBehavior": {
++          "type": "object",
++          "properties": {
++            "enable-os-refresh-update": {
++              "type": "boolean"
++            },
++            "enable-os-upgrade": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "enable-os-refresh-update",
++            "enable-os-upgrade"
++          ]
++        },
++        "Value": {
++          "type": "object",
++          "properties": {
++            "arch": {
++              "type": "string"
++            },
++            "container": {
++              "type": "string"
++            },
++            "cores": {
++              "type": "integer"
++            },
++            "cpu-power": {
++              "type": "integer"
++            },
++            "instance-type": {
++              "type": "string"
++            },
++            "mem": {
++              "type": "integer"
++            },
++            "root-disk": {
++              "type": "integer"
++            },
++            "spaces": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "virt-type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "WatchContainer": {
++          "type": "object",
++          "properties": {
++            "container-type": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "container-type"
++          ]
++        },
++        "WatchContainers": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/WatchContainer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ProxyUpdater",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ProxyConfigResults"
++            }
++          }
++        },
++        "WatchForProxyConfigAndAPIHostPortChanges": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ProxyConfig": {
++          "type": "object",
++          "properties": {
++            "ftp": {
++              "type": "string"
++            },
++            "http": {
++              "type": "string"
++            },
++            "https": {
++              "type": "string"
++            },
++            "no-proxy": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "http",
++            "https",
++            "ftp",
++            "no-proxy"
++          ]
++        },
++        "ProxyConfigResult": {
++          "type": "object",
++          "properties": {
++            "apt-proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "proxy-settings": {
++              "$ref": "#/definitions/ProxyConfig"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "proxy-settings",
++            "apt-proxy-settings"
++          ]
++        },
++        "ProxyConfigResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ProxyConfigResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Reboot",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ClearReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetRebootAction": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RebootActionResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchForRebootEvent": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "RebootActionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RebootActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RebootActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        }
++      }
++    }
++  },
++  {
++    "Name": "RelationUnitsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resources",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddPendingResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddPendingResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddPendingResourcesResult"
++            }
++          }
++        },
++        "ListResources": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResourcesResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddCharmWithAuthorization": {
++          "type": "object",
++          "properties": {
++            "channel": {
++              "type": "string"
++            },
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url",
++            "channel",
++            "macaroon"
++          ]
++        },
++        "AddPendingResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "AddCharmWithAuthorization": {
++              "$ref": "#/definitions/AddCharmWithAuthorization"
++            },
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "AddCharmWithAuthorization",
++            "resources"
++          ]
++        },
++        "AddPendingResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "pending-ids": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "pending-ids"
++          ]
++        },
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "ResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "charm-store-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmResource"
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            },
++            "unit-resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResources"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources",
++            "charm-store-resources",
++            "unit-resources"
++          ]
++        },
++        "ResourcesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResourcesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitResources": {
++          "type": "object",
++          "properties": {
++            "Entity": {
++              "$ref": "#/definitions/Entity"
++            },
++            "download-progress": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "integer"
++                }
++              }
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Resource"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Entity",
++            "resources",
++            "download-progress"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "ResourcesHookContext",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "GetResourceInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ListUnitResourcesArgs"
++            },
++            "Result": {
++              "$ref": "#/definitions/UnitResourcesResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "CharmResource": {
++          "type": "object",
++          "properties": {
++            "description": {
++              "type": "string"
++            },
++            "fingerprint": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "origin": {
++              "type": "string"
++            },
++            "path": {
++              "type": "string"
++            },
++            "revision": {
++              "type": "integer"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "type": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "type",
++            "path",
++            "origin",
++            "revision",
++            "fingerprint",
++            "size"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ListUnitResourcesArgs": {
++          "type": "object",
++          "properties": {
++            "resource-names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "resource-names"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Resource": {
++          "type": "object",
++          "properties": {
++            "CharmResource": {
++              "$ref": "#/definitions/CharmResource"
++            },
++            "application": {
++              "type": "string"
++            },
++            "id": {
++              "type": "string"
++            },
++            "pending-id": {
++              "type": "string"
++            },
++            "timestamp": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "CharmResource",
++            "id",
++            "pending-id",
++            "application",
++            "username",
++            "timestamp"
++          ]
++        },
++        "UnitResourceResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resource": {
++              "$ref": "#/definitions/Resource"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resource"
++          ]
++        },
++        "UnitResourcesResult": {
++          "type": "object",
++          "properties": {
++            "ErrorResult": {
++              "$ref": "#/definitions/ErrorResult"
++            },
++            "resources": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UnitResourceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ErrorResult",
++            "resources"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Resumer",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ResumeTransactions": {
++          "type": "object"
++        }
++      }
++    }
++  },
++  {
++    "Name": "RetryStrategy",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/RetryStrategyResults"
++            }
++          }
++        },
++        "WatchRetryStrategy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RetryStrategy": {
++          "type": "object",
++          "properties": {
++            "jitter-retry-time": {
++              "type": "boolean"
++            },
++            "max-retry-time": {
++              "type": "integer"
++            },
++            "min-retry-time": {
++              "type": "integer"
++            },
++            "retry-time-factor": {
++              "type": "integer"
++            },
++            "should-retry": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "should-retry",
++            "min-retry-time",
++            "max-retry-time",
++            "jitter-retry-time",
++            "retry-time-factor"
++          ]
++        },
++        "RetryStrategyResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/RetryStrategy"
++            }
++          },
++          "additionalProperties": false
++        },
++        "RetryStrategyResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RetryStrategyResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "SSHClient",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AllAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressesResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "Proxy": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SSHProxyResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHAddressResults"
++            }
++          }
++        },
++        "PublicKeys": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/SSHPublicKeysResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SSHAddressResult": {
++          "type": "object",
++          "properties": {
++            "address": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHAddressResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHAddressesResult": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "addresses"
++          ]
++        },
++        "SSHAddressesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHAddressesResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SSHProxyResult": {
++          "type": "object",
++          "properties": {
++            "use-proxy": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "use-proxy"
++          ]
++        },
++        "SSHPublicKeysResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "public-keys": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "SSHPublicKeysResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SSHPublicKeysResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Singular",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Claim": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SingularClaims"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Wait": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SingularClaim": {
++          "type": "object",
++          "properties": {
++            "controller-tag": {
++              "type": "string"
++            },
++            "duration": {
++              "type": "integer"
++            },
++            "model-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "model-tag",
++            "controller-tag",
++            "duration"
++          ]
++        },
++        "SingularClaims": {
++          "type": "object",
++          "properties": {
++            "claims": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SingularClaim"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "claims"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Spaces",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "CreateSpaces": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CreateSpacesParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ListSpacesResults"
++            }
++          }
++        },
++        "ReloadSpaces": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "CreateSpaceParams": {
++          "type": "object",
++          "properties": {
++            "provider-id": {
++              "type": "string"
++            },
++            "public": {
++              "type": "boolean"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-tags": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnet-tags",
++            "space-tag",
++            "public"
++          ]
++        },
++        "CreateSpacesParams": {
++          "type": "object",
++          "properties": {
++            "spaces": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CreateSpaceParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "spaces"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSpacesResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Space"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "Space": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "subnets"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StatusHistory",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "Prune": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StatusHistoryPruneArgs"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "StatusHistoryPruneArgs": {
++          "type": "object",
++          "properties": {
++            "max-history-mb": {
++              "type": "integer"
++            },
++            "max-history-time": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "max-history-time",
++            "max-history-mb"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Storage",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddToUnit": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Attach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CreatePool": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePool"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Detach": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ListFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemDetailsListResults"
++            }
++          }
++        },
++        "ListPools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragePoolFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StoragePoolsResults"
++            }
++          }
++        },
++        "ListStorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsListResults"
++            }
++          }
++        },
++        "ListVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeDetailsListResults"
++            }
++          }
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageDetailsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatus": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "status",
++            "info",
++            "since"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "FilesystemAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "FilesystemAttachmentInfo": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "FilesystemAttachmentInfo"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetails": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/FilesystemAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info",
++            "status"
++          ]
++        },
++        "FilesystemDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag",
++            "machine-tag"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetails": {
++          "type": "object",
++          "properties": {
++            "attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StorageAttachmentDetails"
++                }
++              }
++            },
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "kind",
++            "status",
++            "persistent"
++          ]
++        },
++        "StorageDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageDetails"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageDetailsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageDetailsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageFilter": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StorageFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePool": {
++          "type": "object",
++          "properties": {
++            "attrs": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "name": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "provider",
++            "attrs"
++          ]
++        },
++        "StoragePoolFilter": {
++          "type": "object",
++          "properties": {
++            "names": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "providers": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "storage-pools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePool"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragePoolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StoragePoolsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "VolumeAttachmentDetails": {
++          "type": "object",
++          "properties": {
++            "VolumeAttachmentInfo": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "VolumeAttachmentInfo"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetails": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "life": {
++              "type": "string"
++            },
++            "machine-attachments": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/VolumeAttachmentDetails"
++                }
++              }
++            },
++            "status": {
++              "$ref": "#/definitions/EntityStatus"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageDetails"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info",
++            "status"
++          ]
++        },
++        "VolumeDetailsListResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetails"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeDetailsListResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeDetailsListResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilter": {
++          "type": "object",
++          "properties": {
++            "machines": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeFilters": {
++          "type": "object",
++          "properties": {
++            "filters": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeFilter"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StorageProvisioner",
++    "Version": 3,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentParamsResults"
++            }
++          }
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemAttachmentResults"
++            }
++          }
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemParamsResults"
++            }
++          }
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/FilesystemResults"
++            }
++          }
++        },
++        "InstanceId": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Remove": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveAttachment": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/FilesystemAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetFilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Filesystems"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/VolumeAttachments"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetVolumeInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Volumes"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentParamsResults"
++            }
++          }
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeAttachmentResults"
++            }
++          }
++        },
++        "VolumeBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MachineStorageIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/BlockDeviceResults"
++            }
++          }
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeParamsResults"
++            }
++          }
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VolumeResults"
++            }
++          }
++        },
++        "WatchBlockDevices": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchFilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchFilesystems": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchMachines": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchVolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResults"
++            }
++          }
++        },
++        "WatchVolumes": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "BlockDevice": {
++          "type": "object",
++          "properties": {
++            "BusAddress": {
++              "type": "string"
++            },
++            "DeviceLinks": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "DeviceName": {
++              "type": "string"
++            },
++            "FilesystemType": {
++              "type": "string"
++            },
++            "HardwareId": {
++              "type": "string"
++            },
++            "InUse": {
++              "type": "boolean"
++            },
++            "Label": {
++              "type": "string"
++            },
++            "MountPoint": {
++              "type": "string"
++            },
++            "Size": {
++              "type": "integer"
++            },
++            "UUID": {
++              "type": "string"
++            },
++            "WWN": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "DeviceName",
++            "DeviceLinks",
++            "Label",
++            "UUID",
++            "HardwareId",
++            "WWN",
++            "BusAddress",
++            "Size",
++            "FilesystemType",
++            "InUse",
++            "MountPoint"
++          ]
++        },
++        "BlockDeviceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/BlockDevice"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BlockDeviceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BlockDeviceResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Filesystem": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachment": {
++          "type": "object",
++          "properties": {
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/FilesystemAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "FilesystemAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "mount-point": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "mount-point": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "FilesystemAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemAttachments": {
++          "type": "object",
++          "properties": {
++            "filesystem-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-attachments"
++          ]
++        },
++        "FilesystemInfo": {
++          "type": "object",
++          "properties": {
++            "filesystem-id": {
++              "type": "string"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-id",
++            "pool",
++            "size"
++          ]
++        },
++        "FilesystemParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/FilesystemAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "filesystem-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystem-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "FilesystemParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/FilesystemParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "FilesystemResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Filesystem"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "FilesystemResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/FilesystemResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Filesystems": {
++          "type": "object",
++          "properties": {
++            "filesystems": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Filesystem"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "filesystems"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "MachineStorageIdsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageIdsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Volume": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeInfo"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachment": {
++          "type": "object",
++          "properties": {
++            "info": {
++              "$ref": "#/definitions/VolumeAttachmentInfo"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "info"
++          ]
++        },
++        "VolumeAttachmentInfo": {
++          "type": "object",
++          "properties": {
++            "bus-address": {
++              "type": "string"
++            },
++            "device-link": {
++              "type": "string"
++            },
++            "device-name": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentParams": {
++          "type": "object",
++          "properties": {
++            "instance-id": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            },
++            "provider": {
++              "type": "string"
++            },
++            "read-only": {
++              "type": "boolean"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "machine-tag",
++            "provider"
++          ]
++        },
++        "VolumeAttachmentParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeAttachments": {
++          "type": "object",
++          "properties": {
++            "volume-attachments": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeAttachment"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-attachments"
++          ]
++        },
++        "VolumeInfo": {
++          "type": "object",
++          "properties": {
++            "hardware-id": {
++              "type": "string"
++            },
++            "persistent": {
++              "type": "boolean"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "volume-id": {
++              "type": "string"
++            },
++            "wwn": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-id",
++            "size",
++            "persistent"
++          ]
++        },
++        "VolumeParams": {
++          "type": "object",
++          "properties": {
++            "attachment": {
++              "$ref": "#/definitions/VolumeAttachmentParams"
++            },
++            "attributes": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "provider": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "tags": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "volume-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volume-tag",
++            "size",
++            "provider"
++          ]
++        },
++        "VolumeParamsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/VolumeParams"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeParamsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeParamsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "VolumeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/Volume"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "VolumeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VolumeResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Volumes": {
++          "type": "object",
++          "properties": {
++            "volumes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Volume"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "volumes"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "StringsWatcher",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Subnets",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddSubnetsParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllSpaces": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/SpaceResults"
++            }
++          }
++        },
++        "AllZones": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ZoneResults"
++            }
++          }
++        },
++        "ListSubnets": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SubnetsFilters"
++            },
++            "Result": {
++              "$ref": "#/definitions/ListSubnetsResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddSubnetParams": {
++          "type": "object",
++          "properties": {
++            "provider-network-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "subnet-provider-id": {
++              "type": "string"
++            },
++            "subnet-tag": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "space-tag"
++          ]
++        },
++        "AddSubnetsParams": {
++          "type": "object",
++          "properties": {
++            "subnets": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddSubnetParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "subnets"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ListSubnetsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Subnet"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SpaceResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "SpaceResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SpaceResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Subnet": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "provider-id": {
++              "type": "string"
++            },
++            "provider-network-id": {
++              "type": "string"
++            },
++            "provider-space-id": {
++              "type": "string"
++            },
++            "space-tag": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "vlan-tag": {
++              "type": "integer"
++            },
++            "zones": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "cidr",
++            "vlan-tag",
++            "life",
++            "space-tag",
++            "zones"
++          ]
++        },
++        "SubnetsFilters": {
++          "type": "object",
++          "properties": {
++            "space-tag": {
++              "type": "string"
++            },
++            "zone": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ZoneResult": {
++          "type": "object",
++          "properties": {
++            "available": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "available"
++          ]
++        },
++        "ZoneResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ZoneResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Undertaker",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelInfo": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/UndertakerModelInfoResult"
++            }
++          }
++        },
++        "ProcessDyingModel": {
++          "type": "object"
++        },
++        "RemoveModel": {
++          "type": "object"
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UpdateStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchModelResources": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "UndertakerModelInfo": {
++          "type": "object",
++          "properties": {
++            "global-name": {
++              "type": "string"
++            },
++            "is-system": {
++              "type": "boolean"
++            },
++            "life": {
++              "type": "string"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "name",
++            "global-name",
++            "is-system",
++            "life"
++          ]
++        },
++        "UndertakerModelInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UndertakerModelInfo"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UnitAssigner",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AssignUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "WatchUnitAssignments": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResult"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Uniter",
++    "Version": 5,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "APIAddresses": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringsResult"
++            }
++          }
++        },
++        "APIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/APIHostPortsResult"
++            }
++          }
++        },
++        "Actions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ActionResults"
++            }
++          }
++        },
++        "AddMetricBatches": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MetricBatchParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AddUnitStorage": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StoragesAddParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "AllMachinePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MachinePortsResults"
++            }
++          }
++        },
++        "ApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ApplicationStatusResults"
++            }
++          }
++        },
++        "AssignedMachine": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "AvailabilityZone": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "BeginActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "CACert": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/BytesResult"
++            }
++          }
++        },
++        "CharmArchiveSha256": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/CharmURLs"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "CharmModifiedVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/IntResults"
++            }
++          }
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "ClearResolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ClosePorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ConfigSettingsResults"
++            }
++          }
++        },
++        "CurrentModel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelResult"
++            }
++          }
++        },
++        "Destroy": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyAllSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "DestroyUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnsureDead": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnterScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "FinishActions": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/ActionExecutionResults"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "GetMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/MeterStatusResults"
++            }
++          }
++        },
++        "GetPrincipal": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringBoolResults"
++            }
++          }
++        },
++        "HasSubordinates": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/BoolResults"
++            }
++          }
++        },
++        "JoinedRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsResults"
++            }
++          }
++        },
++        "LeaveScope": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Life": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "Merge": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/MergeLeadershipSettingsBulkParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "ModelConfig": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/ModelConfigResult"
++            }
++          }
++        },
++        "ModelUUID": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "NetworkInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/NetworkInfoParams"
++            },
++            "Result": {
++              "$ref": "#/definitions/NetworkInfoResults"
++            }
++          }
++        },
++        "OpenPorts": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesPortRanges"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "PrivateAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "ProviderType": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "PublicAddress": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        },
++        "Read": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/GetLeadershipSettingsBulkResults"
++            }
++          }
++        },
++        "ReadRemoteSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitPairs"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "ReadSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/SettingsResults"
++            }
++          }
++        },
++        "Relation": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RelationById": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationResults"
++            }
++          }
++        },
++        "RemoveStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RequestReboot": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Resolved": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ResolvedModeResults"
++            }
++          }
++        },
++        "SLALevel": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/StringResult"
++            }
++          }
++        },
++        "SetAgentStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetApplicationStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetCharmURL": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesCharmURL"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetUnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/SetStatus"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityWorkloadVersions"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "StorageAttachmentLife": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/LifeResults"
++            }
++          }
++        },
++        "StorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentResults"
++            }
++          }
++        },
++        "UnitStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StatusResults"
++            }
++          }
++        },
++        "UnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StorageAttachmentIdsResults"
++            }
++          }
++        },
++        "UpdateSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnitsSettings"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Watch": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchAPIHostPorts": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchActionNotifications": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchConfigSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchForModelConfigChanges": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResult"
++            }
++          }
++        },
++        "WatchLeadershipSettings": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchMeterStatus": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchRelationUnits": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/RelationUnits"
++            },
++            "Result": {
++              "$ref": "#/definitions/RelationUnitsWatchResults"
++            }
++          }
++        },
++        "WatchStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitAddresses": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        },
++        "WatchUnitRelations": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WatchUnitStorageAttachments": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringsWatchResults"
++            }
++          }
++        },
++        "WorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/StringResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "APIHostPortsResult": {
++          "type": "object",
++          "properties": {
++            "servers": {
++              "type": "array",
++              "items": {
++                "type": "array",
++                "items": {
++                  "$ref": "#/definitions/HostPort"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "servers"
++          ]
++        },
++        "Action": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "parameters": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "receiver": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "receiver",
++            "name"
++          ]
++        },
++        "ActionExecutionResult": {
++          "type": "object",
++          "properties": {
++            "action-tag": {
++              "type": "string"
++            },
++            "message": {
++              "type": "string"
++            },
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "action-tag",
++            "status"
++          ]
++        },
++        "ActionExecutionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionExecutionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResult": {
++          "type": "object",
++          "properties": {
++            "action": {
++              "$ref": "#/definitions/Action"
++            },
++            "completed": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "enqueued": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "message": {
++              "type": "string"
++            },
++            "output": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "started": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ActionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ActionResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "Address": {
++          "type": "object",
++          "properties": {
++            "scope": {
++              "type": "string"
++            },
++            "space-name": {
++              "type": "string"
++            },
++            "type": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "type",
++            "scope"
++          ]
++        },
++        "ApplicationStatusResult": {
++          "type": "object",
++          "properties": {
++            "application": {
++              "$ref": "#/definitions/StatusResult"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "units": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/StatusResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application",
++            "units"
++          ]
++        },
++        "ApplicationStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ApplicationStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "BoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/BoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "BytesResult": {
++          "type": "object",
++          "properties": {
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "CharmRelation": {
++          "type": "object",
++          "properties": {
++            "interface": {
++              "type": "string"
++            },
++            "limit": {
++              "type": "integer"
++            },
++            "name": {
++              "type": "string"
++            },
++            "optional": {
++              "type": "boolean"
++            },
++            "role": {
++              "type": "string"
++            },
++            "scope": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "role",
++            "interface",
++            "optional",
++            "limit",
++            "scope"
++          ]
++        },
++        "CharmURL": {
++          "type": "object",
++          "properties": {
++            "url": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "url"
++          ]
++        },
++        "CharmURLs": {
++          "type": "object",
++          "properties": {
++            "urls": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/CharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "urls"
++          ]
++        },
++        "ConfigSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "ConfigSettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ConfigSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Endpoint": {
++          "type": "object",
++          "properties": {
++            "application-name": {
++              "type": "string"
++            },
++            "relation": {
++              "$ref": "#/definitions/CharmRelation"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-name",
++            "relation"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesCharmURL": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityCharmURL"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesPortRanges": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityCharmURL": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "charm-url"
++          ]
++        },
++        "EntityPortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "protocol",
++            "from-port",
++            "to-port"
++          ]
++        },
++        "EntityStatusArgs": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "info": {
++              "type": "string"
++            },
++            "status": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "status",
++            "info",
++            "data"
++          ]
++        },
++        "EntityWorkloadVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "workload-version": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "workload-version"
++          ]
++        },
++        "EntityWorkloadVersions": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityWorkloadVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsBulkResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/GetLeadershipSettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "GetLeadershipSettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "HostPort": {
++          "type": "object",
++          "properties": {
++            "Address": {
++              "$ref": "#/definitions/Address"
++            },
++            "port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Address",
++            "port"
++          ]
++        },
++        "IntResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "IntResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/IntResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "InterfaceAddress": {
++          "type": "object",
++          "properties": {
++            "cidr": {
++              "type": "string"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "value",
++            "cidr"
++          ]
++        },
++        "LifeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life"
++          ]
++        },
++        "LifeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/LifeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachinePortRange": {
++          "type": "object",
++          "properties": {
++            "port-range": {
++              "$ref": "#/definitions/PortRange"
++            },
++            "relation-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit-tag",
++            "relation-tag",
++            "port-range"
++          ]
++        },
++        "MachinePortsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ports": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortRange"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ports"
++          ]
++        },
++        "MachinePortsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachinePortsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "MergeLeadershipSettingsBulkParams": {
++          "type": "object",
++          "properties": {
++            "params": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MergeLeadershipSettingsParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "params"
++          ]
++        },
++        "MergeLeadershipSettingsParam": {
++          "type": "object",
++          "properties": {
++            "application-tag": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "application-tag",
++            "settings"
++          ]
++        },
++        "MeterStatusResult": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "info": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "code",
++            "info"
++          ]
++        },
++        "MeterStatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MeterStatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Metric": {
++          "type": "object",
++          "properties": {
++            "key": {
++              "type": "string"
++            },
++            "time": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "value": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "key",
++            "value",
++            "time"
++          ]
++        },
++        "MetricBatch": {
++          "type": "object",
++          "properties": {
++            "charm-url": {
++              "type": "string"
++            },
++            "created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "metrics": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Metric"
++              }
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "uuid",
++            "charm-url",
++            "created",
++            "metrics"
++          ]
++        },
++        "MetricBatchParam": {
++          "type": "object",
++          "properties": {
++            "batch": {
++              "$ref": "#/definitions/MetricBatch"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "batch"
++          ]
++        },
++        "MetricBatchParams": {
++          "type": "object",
++          "properties": {
++            "batches": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MetricBatchParam"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "batches"
++          ]
++        },
++        "ModelConfigResult": {
++          "type": "object",
++          "properties": {
++            "config": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "config"
++          ]
++        },
++        "ModelResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "name": {
++              "type": "string"
++            },
++            "uuid": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "name",
++            "uuid"
++          ]
++        },
++        "NetworkInfo": {
++          "type": "object",
++          "properties": {
++            "addresses": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/InterfaceAddress"
++              }
++            },
++            "interface-name": {
++              "type": "string"
++            },
++            "mac-address": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mac-address",
++            "interface-name",
++            "addresses"
++          ]
++        },
++        "NetworkInfoParams": {
++          "type": "object",
++          "properties": {
++            "bindings": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "bindings"
++          ]
++        },
++        "NetworkInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "network-info": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NetworkInfo"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "network-info"
++          ]
++        },
++        "NetworkInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/NetworkInfoResult"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "PortRange": {
++          "type": "object",
++          "properties": {
++            "from-port": {
++              "type": "integer"
++            },
++            "protocol": {
++              "type": "string"
++            },
++            "to-port": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "from-port",
++            "to-port",
++            "protocol"
++          ]
++        },
++        "RelationIds": {
++          "type": "object",
++          "properties": {
++            "relation-ids": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-ids"
++          ]
++        },
++        "RelationResult": {
++          "type": "object",
++          "properties": {
++            "endpoint": {
++              "$ref": "#/definitions/Endpoint"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "integer"
++            },
++            "key": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "life",
++            "id",
++            "key",
++            "endpoint"
++          ]
++        },
++        "RelationResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "RelationUnit": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit"
++          ]
++        },
++        "RelationUnitPair": {
++          "type": "object",
++          "properties": {
++            "local-unit": {
++              "type": "string"
++            },
++            "relation": {
++              "type": "string"
++            },
++            "remote-unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "local-unit",
++            "remote-unit"
++          ]
++        },
++        "RelationUnitPairs": {
++          "type": "object",
++          "properties": {
++            "relation-unit-pairs": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitPair"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-unit-pairs"
++          ]
++        },
++        "RelationUnitSettings": {
++          "type": "object",
++          "properties": {
++            "relation": {
++              "type": "string"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation",
++            "unit",
++            "settings"
++          ]
++        },
++        "RelationUnits": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnit"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsChange": {
++          "type": "object",
++          "properties": {
++            "changed": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "$ref": "#/definitions/UnitSettings"
++                }
++              }
++            },
++            "departed": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changed"
++          ]
++        },
++        "RelationUnitsSettings": {
++          "type": "object",
++          "properties": {
++            "relation-units": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitSettings"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "relation-units"
++          ]
++        },
++        "RelationUnitsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "$ref": "#/definitions/RelationUnitsChange"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        },
++        "RelationUnitsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/RelationUnitsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "ResolvedModeResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "mode": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "mode"
++          ]
++        },
++        "ResolvedModeResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ResolvedModeResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "SetStatus": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityStatusArgs"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "SettingsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "settings": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "string"
++                }
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "settings"
++          ]
++        },
++        "SettingsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/SettingsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StatusResult": {
++          "type": "object",
++          "properties": {
++            "data": {
++              "type": "object",
++              "patternProperties": {
++                ".*": {
++                  "type": "object",
++                  "additionalProperties": true
++                }
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "id": {
++              "type": "string"
++            },
++            "info": {
++              "type": "string"
++            },
++            "life": {
++              "type": "string"
++            },
++            "since": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "status": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "id",
++            "life",
++            "status",
++            "info",
++            "data",
++            "since"
++          ]
++        },
++        "StatusResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StatusResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StorageAddParams": {
++          "type": "object",
++          "properties": {
++            "name": {
++              "type": "string"
++            },
++            "storage": {
++              "$ref": "#/definitions/StorageConstraints"
++            },
++            "unit": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "unit",
++            "name",
++            "storage"
++          ]
++        },
++        "StorageAttachment": {
++          "type": "object",
++          "properties": {
++            "kind": {
++              "type": "integer"
++            },
++            "life": {
++              "type": "string"
++            },
++            "location": {
++              "type": "string"
++            },
++            "owner-tag": {
++              "type": "string"
++            },
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "owner-tag",
++            "unit-tag",
++            "kind",
++            "location",
++            "life"
++          ]
++        },
++        "StorageAttachmentId": {
++          "type": "object",
++          "properties": {
++            "storage-tag": {
++              "type": "string"
++            },
++            "unit-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storage-tag",
++            "unit-tag"
++          ]
++        },
++        "StorageAttachmentIds": {
++          "type": "object",
++          "properties": {
++            "ids": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentId"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "ids"
++          ]
++        },
++        "StorageAttachmentIdsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachmentIds"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentIdsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentIdsResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageAttachmentResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/StorageAttachment"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StorageAttachmentResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAttachmentResult"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StorageConstraints": {
++          "type": "object",
++          "properties": {
++            "count": {
++              "type": "integer"
++            },
++            "pool": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false
++        },
++        "StoragesAddParams": {
++          "type": "object",
++          "properties": {
++            "storages": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StorageAddParams"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "storages"
++          ]
++        },
++        "StringBoolResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "ok": {
++              "type": "boolean"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result",
++            "ok"
++          ]
++        },
++        "StringBoolResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringBoolResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "result"
++          ]
++        },
++        "StringResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            }
++          },
++          "additionalProperties": false
++        },
++        "StringsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "StringsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "type": "string"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id"
++          ]
++        },
++        "StringsWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/StringsWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "UnitSettings": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "type": "integer"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "Upgrader",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "DesiredVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/VersionResults"
++            }
++          }
++        },
++        "SetTools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntitiesVersion"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ToolsResults"
++            }
++          }
++        },
++        "WatchAPIVersion": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/NotifyWatchResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "Binary": {
++          "type": "object",
++          "properties": {
++            "Arch": {
++              "type": "string"
++            },
++            "Number": {
++              "$ref": "#/definitions/Number"
++            },
++            "Series": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Number",
++            "Series",
++            "Arch"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "EntitiesVersion": {
++          "type": "object",
++          "properties": {
++            "agent-tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityVersion"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "agent-tools"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityVersion": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            },
++            "tools": {
++              "$ref": "#/definitions/Version"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "tools"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "NotifyWatchResult": {
++          "type": "object",
++          "properties": {
++            "NotifyWatcherId": {
++              "type": "string"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "NotifyWatcherId"
++          ]
++        },
++        "NotifyWatchResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/NotifyWatchResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Number": {
++          "type": "object",
++          "properties": {
++            "Build": {
++              "type": "integer"
++            },
++            "Major": {
++              "type": "integer"
++            },
++            "Minor": {
++              "type": "integer"
++            },
++            "Patch": {
++              "type": "integer"
++            },
++            "Tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "Major",
++            "Minor",
++            "Tag",
++            "Patch",
++            "Build"
++          ]
++        },
++        "Tools": {
++          "type": "object",
++          "properties": {
++            "sha256": {
++              "type": "string"
++            },
++            "size": {
++              "type": "integer"
++            },
++            "url": {
++              "type": "string"
++            },
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version",
++            "url",
++            "size"
++          ]
++        },
++        "ToolsResult": {
++          "type": "object",
++          "properties": {
++            "disable-ssl-hostname-verification": {
++              "type": "boolean"
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "tools": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Tools"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tools",
++            "disable-ssl-hostname-verification"
++          ]
++        },
++        "ToolsResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ToolsResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Version": {
++          "type": "object",
++          "properties": {
++            "version": {
++              "$ref": "#/definitions/Binary"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "version"
++          ]
++        },
++        "VersionResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "version": {
++              "$ref": "#/definitions/Number"
++            }
++          },
++          "additionalProperties": false
++        },
++        "VersionResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/VersionResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "UserManager",
++    "Version": 1,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/AddUsers"
++            },
++            "Result": {
++              "$ref": "#/definitions/AddUserResults"
++            }
++          }
++        },
++        "DisableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "EnableUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "RemoveUser": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/Entities"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "SetPassword": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/EntityPasswords"
++            },
++            "Result": {
++              "$ref": "#/definitions/ErrorResults"
++            }
++          }
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "Params": {
++              "$ref": "#/definitions/UserInfoRequest"
++            },
++            "Result": {
++              "$ref": "#/definitions/UserInfoResults"
++            }
++          }
++        }
++      },
++      "definitions": {
++        "AddUser": {
++          "type": "object",
++          "properties": {
++            "display-name": {
++              "type": "string"
++            },
++            "password": {
++              "type": "string"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name"
++          ]
++        },
++        "AddUserResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "secret-key": {
++              "type": "array",
++              "items": {
++                "type": "integer"
++              }
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "AddUserResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUserResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "AddUsers": {
++          "type": "object",
++          "properties": {
++            "users": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/AddUser"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "users"
++          ]
++        },
++        "Entities": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities"
++          ]
++        },
++        "Entity": {
++          "type": "object",
++          "properties": {
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag"
++          ]
++        },
++        "EntityPassword": {
++          "type": "object",
++          "properties": {
++            "password": {
++              "type": "string"
++            },
++            "tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "tag",
++            "password"
++          ]
++        },
++        "EntityPasswords": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/EntityPassword"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "changes"
++          ]
++        },
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            }
++          },
++          "additionalProperties": false
++        },
++        "ErrorResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/ErrorResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "UserInfo": {
++          "type": "object",
++          "properties": {
++            "access": {
++              "type": "string"
++            },
++            "created-by": {
++              "type": "string"
++            },
++            "date-created": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "disabled": {
++              "type": "boolean"
++            },
++            "display-name": {
++              "type": "string"
++            },
++            "last-connection": {
++              "type": "string",
++              "format": "date-time"
++            },
++            "username": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "username",
++            "display-name",
++            "access",
++            "created-by",
++            "date-created",
++            "disabled"
++          ]
++        },
++        "UserInfoRequest": {
++          "type": "object",
++          "properties": {
++            "entities": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/Entity"
++              }
++            },
++            "include-disabled": {
++              "type": "boolean"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "entities",
++            "include-disabled"
++          ]
++        },
++        "UserInfoResult": {
++          "type": "object",
++          "properties": {
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "result": {
++              "$ref": "#/definitions/UserInfo"
++            }
++          },
++          "additionalProperties": false
++        },
++        "UserInfoResults": {
++          "type": "object",
++          "properties": {
++            "results": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/UserInfoResult"
++              }
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "results"
++          ]
++        }
++      }
++    }
++  },
++  {
++    "Name": "VolumeAttachmentsWatcher",
++    "Version": 2,
++    "Schema": {
++      "type": "object",
++      "properties": {
++        "Next": {
++          "type": "object",
++          "properties": {
++            "Result": {
++              "$ref": "#/definitions/MachineStorageIdsWatchResult"
++            }
++          }
++        },
++        "Stop": {
++          "type": "object"
++        }
++      },
++      "definitions": {
++        "Error": {
++          "type": "object",
++          "properties": {
++            "code": {
++              "type": "string"
++            },
++            "info": {
++              "$ref": "#/definitions/ErrorInfo"
++            },
++            "message": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "message",
++            "code"
++          ]
++        },
++        "ErrorInfo": {
++          "type": "object",
++          "properties": {
++            "macaroon": {
++              "$ref": "#/definitions/Macaroon"
++            },
++            "macaroon-path": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false
++        },
++        "Macaroon": {
++          "type": "object",
++          "additionalProperties": false
++        },
++        "MachineStorageId": {
++          "type": "object",
++          "properties": {
++            "attachment-tag": {
++              "type": "string"
++            },
++            "machine-tag": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "machine-tag",
++            "attachment-tag"
++          ]
++        },
++        "MachineStorageIdsWatchResult": {
++          "type": "object",
++          "properties": {
++            "changes": {
++              "type": "array",
++              "items": {
++                "$ref": "#/definitions/MachineStorageId"
++              }
++            },
++            "error": {
++              "$ref": "#/definitions/Error"
++            },
++            "watcher-id": {
++              "type": "string"
++            }
++          },
++          "additionalProperties": false,
++          "required": [
++            "watcher-id",
++            "changes"
++          ]
++        }
++      }
++    }
++  }
++]
index 0000000,0000000..6a2593e
new file mode 120000 (symlink)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++schemas-juju-2.3-alpha1.json
index 0000000,0000000..e4793ee
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,81 @@@
++class Cloud(object):
++    """Cloud
++
++    :ivar name: Name of the cloud
++
++    """
++    def add_credential(self, credential):
++        """Add or replaces credentials for this cloud.
++
++        :param `juju.Credential` credential: The Credential to add
++
++        """
++        raise NotImplementedError()
++
++    def get_credentials(self):
++        """Return list of all credentials for this cloud.
++
++        """
++        raise NotImplementedError()
++
++    def remove_credential(self, credential_name):
++        """Remove a credential for this cloud.
++
++        :param str credential_name: Name of the credential to remove
++
++        """
++        raise NotImplementedError()
++
++    def bootstrap(
++            self, controller_name, region=None, agent_version=None,
++            auto_upgrade=False, bootstrap_constraints=None,
++            bootstrap_series=None, config=None, constraints=None,
++            credential=None, default_model=None, keep_broken=False,
++            metadata_source=None, no_gui=False, to=None,
++            upload_tools=False):
++
++        """Initialize a cloud environment.
++
++        :param str controller_name: Name of controller to create
++        :param str region: Cloud region in which to bootstrap
++        :param str agent_version: Version of tools to use for Juju agents
++        :param bool auto_upgrade: Upgrade to latest path release tools on first
++            bootstrap
++        :param bootstrap_constraints: Constraints for the bootstrap machine
++        :type bootstrap_constraints: :class:`juju.Constraints`
++        :param str bootstrap_series: Series of the bootstrap machine
++        :param dict config: Controller configuration
++        :param constraints: Default constraints for all future workload
++            machines
++        :type constraints: :class:`juju.Constraints`
++        :param credential: Credential to use when bootstrapping
++        :type credential: :class:`juju.Credential`
++        :param str default_model: Name to give the default model
++        :param bool keep_broken: Don't destroy model if bootstrap fails
++        :param str metadata_source: Local path to use as tools and/or metadata
++            source
++        :param bool no_gui: Don't install the Juju GUI in the controller when
++            bootstrapping
++        :param str to: Placement directive for bootstrap node (typically used
++            with MAAS)
++        :param bool upload_tools: Upload local version of tools before
++            bootstrapping
++
++        """
++        raise NotImplementedError()
++
++    def set_default_credential(self, credential_name):
++        """Set the default credentials for this cloud.
++
++        :param str credential_name: Credential to make default
++
++        """
++        raise NotImplementedError()
++
++    def set_default_region(self, region):
++        """Set the default region for this cloud.
++
++        :param str region: Name of region to make default
++
++        """
++        raise NotImplementedError()
index 0000000,0000000..998862d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,84 @@@
++#
++# Module that parses constraints
++#
++# The current version of juju core expects the client to take
++# constraints given in the form "mem=10G foo=bar" and parse them into
++# json that looks like {"mem": 10240, "foo": "bar"}. This module helps us
++# accomplish that task.
++#
++# We do not attempt to duplicate the checking done in
++# client/_client.py:Value here. That class will verify that the
++# constraints keys are valid, and that we can successfully dump the
++# constraints dict to json.
++#
++# Once https://bugs.launchpad.net/juju/+bug/1645402 is addressed, this
++# module should be deprecated.
++#
++
++import re
++
++# Matches on a string specifying memory size
++MEM = re.compile('^[1-9][0-9]*[MGTP]$')
++
++# Multiplication factors to get Megabytes
++# https://github.com/juju/juju/blob/master/constraints/constraints.go#L666
++FACTORS = {
++    "M": 1,
++    "G": 1024,
++    "T": 1024 * 1024,
++    "P": 1024 * 1024 * 1024
++}
++
++SNAKE1 = re.compile(r'(.)([A-Z][a-z]+)')
++SNAKE2 = re.compile('([a-z0-9])([A-Z])')
++
++
++def parse(constraints):
++    """
++    Constraints must be expressed as a string containing only spaces
++    and key value pairs joined by an '='.
++
++    """
++    if not constraints:
++        return None
++
++    if type(constraints) is dict:
++        # Fowards compatibilty: already parsed
++        return constraints
++
++    constraints = {
++        normalize_key(k): normalize_value(v) for k, v in [
++            s.split("=") for s in constraints.split(" ")]}
++
++    return constraints
++
++
++def normalize_key(key):
++    key = key.strip()
++
++    key = key.replace("-", "_")  # Our _client lib wants "_" in place of "-"
++
++    # Convert camelCase to snake_case
++    key = SNAKE1.sub(r'\1_\2', key)
++    key = SNAKE2.sub(r'\1_\2', key).lower()
++
++    return key
++
++
++def normalize_value(value):
++    value = value.strip()
++
++    if MEM.match(value):
++        # Translate aliases to Megabytes. e.g. 1G = 10240
++        return int(value[:-1]) * FACTORS[value[-1:]]
++
++    if "," in value:
++        # Handle csv strings.
++        values = value.split(",")
++        values = [normalize_value(v) for v in values]
++        return values
++
++    if value.isdigit():
++        return int(value)
++
++    return value
index 0000000,0000000..9b452c7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,331 @@@
++import asyncio
++import logging
++
++from . import tag
++from . import utils
++from .client import client
++from .client import connection
++from .model import Model
++
++log = logging.getLogger(__name__)
++
++
++class Controller(object):
++    def __init__(self, loop=None,
++                 max_frame_size=connection.Connection.DEFAULT_FRAME_SIZE):
++        """Instantiate a new Controller.
++
++        One of the connect_* methods will need to be called before this
++        object can be used for anything interesting.
++
++        :param loop: an asyncio event loop
++
++        """
++        self.loop = loop or asyncio.get_event_loop()
++        self.max_frame_size = None
++        self.connection = None
++        self.controller_name = None
++
++    async def connect(
++            self, endpoint, username, password, cacert=None, macaroons=None):
++        """Connect to an arbitrary Juju controller.
++
++        """
++        self.connection = await connection.Connection.connect(
++            endpoint, None, username, password, cacert, macaroons,
++            max_frame_size=self.max_frame_size)
++
++    async def connect_current(self):
++        """Connect to the current Juju controller.
++
++        """
++        self.connection = (
++            await connection.Connection.connect_current_controller(
++                max_frame_size=self.max_frame_size))
++
++    async def connect_controller(self, controller_name):
++        """Connect to a Juju controller by name.
++
++        """
++        self.connection = (
++            await connection.Connection.connect_controller(
++                controller_name, max_frame_size=self.max_frame_size))
++        self.controller_name = controller_name
++
++    async def disconnect(self):
++        """Shut down the watcher task and close websockets.
++
++        """
++        if self.connection and self.connection.is_open:
++            log.debug('Closing controller connection')
++            await self.connection.close()
++            self.connection = None
++
++    async def add_model(
++            self, model_name, cloud_name=None, credential_name=None,
++            owner=None, config=None, region=None):
++        """Add a model to this controller.
++
++        :param str model_name: Name to give the new model.
++        :param str cloud_name: Name of the cloud in which to create the
++            model, e.g. 'aws'. Defaults to same cloud as controller.
++        :param str credential_name: Name of the credential to use when
++            creating the model. Defaults to current credential. If you
++            pass a credential_name, you must also pass a cloud_name,
++            even if it's the default cloud.
++        :param str owner: Username that will own the model. Defaults to
++            the current user.
++        :param dict config: Model configuration.
++        :param str region: Region in which to create the model.
++
++        """
++        model_facade = client.ModelManagerFacade.from_connection(
++            self.connection)
++
++        owner = owner or self.connection.info['user-info']['identity']
++        cloud_name = cloud_name or await self.get_cloud()
++
++        if credential_name:
++            credential = tag.credential(
++                cloud_name,
++                tag.untag('user-', owner),
++                credential_name
++            )
++        else:
++            credential = None
++
++        log.debug('Creating model %s', model_name)
++
++        model_info = await model_facade.CreateModel(
++            tag.cloud(cloud_name),
++            config,
++            credential,
++            model_name,
++            owner,
++            region
++        )
++
++        # Add our ssh key to the model, to work around
++        # https://bugs.launchpad.net/juju/+bug/1643076
++        try:
++            ssh_key = await utils.read_ssh_key(loop=self.loop)
++
++            if self.controller_name:
++                model_name = "{}:{}".format(self.controller_name, model_name)
++
++            cmd = ['juju', 'add-ssh-key', '-m', model_name, ssh_key]
++
++            await utils.execute_process(*cmd, log=log, loop=self.loop)
++        except Exception:
++            log.exception(
++                "Could not add ssh key to model. You will not be able "
++                "to ssh into machines in this model. "
++                "Manually running `juju add-ssh-key <key>` in the cli "
++                "may fix this problem.")
++
++        model = Model()
++        await model.connect(
++            self.connection.endpoint,
++            model_info.uuid,
++            self.connection.username,
++            self.connection.password,
++            self.connection.cacert,
++            self.connection.macaroons,
++            loop=self.loop,
++        )
++
++        return model
++
++    async def destroy_models(self, *uuids):
++        """Destroy one or more models.
++
++        :param str \*uuids: UUIDs of models to destroy
++
++        """
++        model_facade = client.ModelManagerFacade.from_connection(
++            self.connection)
++
++        log.debug(
++            'Destroying model%s %s',
++            '' if len(uuids) == 1 else 's',
++            ', '.join(uuids)
++        )
++
++        await model_facade.DestroyModels([
++            client.Entity(tag.model(uuid))
++            for uuid in uuids
++        ])
++    destroy_model = destroy_models
++
++    async def add_user(self, username, password=None, display_name=None):
++        """Add a user to this controller.
++
++        :param str username: Username
++        :param str display_name: Display name
++        :param str acl: Access control, e.g. 'read'
++        :param list models: Models to which the user is granted access
++
++        """
++        if not display_name:
++            display_name = username
++        user_facade = client.UserManagerFacade.from_connection(self.connection)
++        users = [{'display_name': display_name,
++                  'password': password,
++                  'username': username}]
++        return await user_facade.AddUser(users)
++
++    async def change_user_password(self, username, password):
++        """Change the password for a user in this controller.
++
++        :param str username: Username
++        :param str password: New password
++
++        """
++        user_facade = client.UserManagerFacade.from_connection(self.connection)
++        entity = client.EntityPassword(password, tag.user(username))
++        return await user_facade.SetPassword([entity])
++
++    async def destroy(self, destroy_all_models=False):
++        """Destroy this controller.
++
++        :param bool destroy_all_models: Destroy all hosted models in the
++            controller.
++
++        """
++        controller_facade = client.ControllerFacade.from_connection(
++            self.connection)
++        return await controller_facade.DestroyController(destroy_all_models)
++
++    async def disable_user(self, username):
++        """Disable a user.
++
++        :param str username: Username
++
++        """
++        user_facade = client.UserManagerFacade.from_connection(self.connection)
++        entity = client.Entity(tag.user(username))
++        return await user_facade.DisableUser([entity])
++
++    async def enable_user(self, username):
++        """Re-enable a previously disabled user.
++
++        """
++        user_facade = client.UserManagerFacade.from_connection(self.connection)
++        entity = client.Entity(tag.user(username))
++        return await user_facade.EnableUser([entity])
++
++    def kill(self):
++        """Forcibly terminate all machines and other associated resources for
++        this controller.
++
++        """
++        raise NotImplementedError()
++
++    async def get_cloud(self):
++        """
++        Get the name of the cloud that this controller lives on.
++        """
++        cloud_facade = client.CloudFacade.from_connection(self.connection)
++
++        result = await cloud_facade.Clouds()
++        cloud = list(result.clouds.keys())[0]  # only lives on one cloud
++        return tag.untag('cloud-', cloud)
++
++    async def get_models(self, all_=False, username=None):
++        """Return list of available models on this controller.
++
++        :param bool all_: List all models, regardless of user accessibilty
++            (admin use only)
++        :param str username: User for which to list models (admin use only)
++
++        """
++        controller_facade = client.ControllerFacade.from_connection(
++            self.connection)
++        return await controller_facade.AllModels()
++
++    def get_payloads(self, *patterns):
++        """Return list of known payloads.
++
++        :param str \*patterns: Patterns to match against
++
++        Each pattern will be checked against the following info in Juju::
++
++            - unit name
++            - machine id
++            - payload type
++            - payload class
++            - payload id
++            - payload tag
++            - payload status
++
++        """
++        raise NotImplementedError()
++
++    def get_users(self, all_=False):
++        """Return list of users that can connect to this controller.
++
++        :param bool all_: Include disabled users
++
++        """
++        raise NotImplementedError()
++
++    def login(self):
++        """Log in to this controller.
++
++        """
++        raise NotImplementedError()
++
++    def logout(self, force=False):
++        """Log out of this controller.
++
++        :param bool force: Don't fail even if user not previously logged in
++            with a password
++
++        """
++        raise NotImplementedError()
++
++    def get_model(self, name):
++        """Get a model by name.
++
++        :param str name: Model name
++
++        """
++        raise NotImplementedError()
++
++    async def get_user(self, username, include_disabled=False):
++        """Get a user by name.
++
++        :param str username: Username
++
++        """
++        client_facade = client.UserManagerFacade.from_connection(
++            self.connection)
++        user = tag.user(username)
++        return await client_facade.UserInfo([client.Entity(user)],
++                                            include_disabled)
++
++    async def grant(self, username, acl='login'):
++        """Set access level of the given user on the controller
++
++        :param str username: Username
++        :param str acl: Access control ('login', 'add-model' or 'superuser')
++
++        """
++        controller_facade = client.ControllerFacade.from_connection(
++            self.connection)
++        user = tag.user(username)
++        await self.revoke(username)
++        changes = client.ModifyControllerAccess(acl, 'grant', user)
++        return await controller_facade.ModifyControllerAccess([changes])
++
++    async def revoke(self, username):
++        """Removes all access from a controller
++
++        :param str username: username
++
++        """
++        controller_facade = client.ControllerFacade.from_connection(
++            self.connection)
++        user = tag.user(username)
++        changes = client.ModifyControllerAccess('login', 'revoke', user)
++        return await controller_facade.ModifyControllerAccess([changes])
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..b1eba23
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,79 @@@
++from .client import client
++
++
++def get_entity_delta(d):
++    return _delta_types[d.entity](d.deltas)
++
++
++def get_entity_class(entity_type):
++    return _delta_types[entity_type].get_entity_class()
++
++
++class EntityDelta(client.Delta):
++    def get_id(self):
++        return self.data['id']
++
++    @classmethod
++    def get_entity_class(self):
++        return None
++
++
++class ActionDelta(EntityDelta):
++    @classmethod
++    def get_entity_class(self):
++        from .action import Action
++        return Action
++
++
++class ApplicationDelta(EntityDelta):
++    def get_id(self):
++        return self.data['name']
++
++    @classmethod
++    def get_entity_class(self):
++        from .application import Application
++        return Application
++
++
++class AnnotationDelta(EntityDelta):
++    def get_id(self):
++        return self.data['tag']
++
++    @classmethod
++    def get_entity_class(self):
++        from .annotation import Annotation
++        return Annotation
++
++
++class MachineDelta(EntityDelta):
++    @classmethod
++    def get_entity_class(self):
++        from .machine import Machine
++        return Machine
++
++
++class UnitDelta(EntityDelta):
++    def get_id(self):
++        return self.data['name']
++
++    @classmethod
++    def get_entity_class(self):
++        from .unit import Unit
++        return Unit
++
++
++class RelationDelta(EntityDelta):
++    @classmethod
++    def get_entity_class(self):
++        from .relation import Relation
++        return Relation
++
++
++_delta_types = {
++    'action': ActionDelta,
++    'application': ApplicationDelta,
++    'annotation': AnnotationDelta,
++    'machine': MachineDelta,
++    'unit': UnitDelta,
++    'relation': RelationDelta,
++}
index 0000000,0000000..de52174
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++class JujuError(Exception):
++    pass
++
++
++class JujuAPIError(JujuError):
++    def __init__(self, result):
++        self.result = result
++        self.message = result['error']
++        self.error_code = result.get('error-code')
++        self.response = result['response']
++        self.request_id = result['request-id']
++        super().__init__(self.message)
++
++
++class JujuConnectionError(ConnectionError, JujuError):
++    pass
index 0000000,0000000..bcf07b6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++class DeadEntityException(Exception):
++    pass
index 0000000,0000000..a9fcbbe
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,118 @@@
++class Juju(object):
++    def add_cloud(self, name, definition, replace=False):
++        """Add a user-defined cloud to Juju from among known cloud types.
++
++        :param str name: Name of cloud
++        :param dict definition: Cloud definition
++
++        Example cloud definition, as yaml::
++
++            type: openstack
++            auth-types: [ userpass ]
++            regions:
++              london:
++                endpoint: https://london.mycloud.com:35574/v3.0/
++
++        """
++        raise NotImplementedError()
++
++    def agree(self, *terms):
++        """Agree to the terms of a charm.
++
++        :param str \*terms: Terms to agree to
++
++        """
++        raise NotImplementedError()
++
++    def autoload_credentials(self):
++        """Finds cloud credentials and caches them for use by Juju when
++        bootstrapping.
++
++        """
++        raise NotImplementedError()
++
++    def create_budget(self):
++        """Create a new budget.
++
++        """
++        raise NotImplementedError()
++
++    def get_agreements(self):
++        """Return list of terms to which the current user has agreed.
++
++        """
++        raise NotImplementedError()
++
++    def get_budgets(self):
++        """Return list of available budgets.
++
++        """
++        raise NotImplementedError()
++
++    def get_clouds(self):
++        """Return list of all available clouds.
++
++        """
++        raise NotImplementedError()
++
++    def get_controllers(self):
++        """Return list of all available controllers.
++
++        (maybe move this to Cloud?)
++        """
++        raise NotImplementedError()
++
++    def get_plans(self, charm_url):
++        """Return list of plans available for the specified charm.
++
++        :param str charm_url: Charm url
++
++        """
++        raise NotImplementedError()
++
++    def register(self, registration_string):
++        """Register a user to a controller.
++
++        :param str registration_string: The registration string
++
++        """
++        raise NotImplementedError()
++
++    def set_budget(self, name, limit):
++        """Set a monthly budget limit.
++
++        :param str name: Name of budget
++        :param int limit: Monthly limit
++
++        """
++        raise NotImplementedError()
++
++    def get_cloud(self, name):
++        """Get a cloud by name.
++
++        :param str name: Name of cloud
++
++        """
++        raise NotImplementedError()
++
++    def get_controller(self, name, include_passwords=False):
++        """Get a controller by name.
++
++        :param str name: Name of controller
++        :param bool include_passwords: Include passwords for accounts
++
++        (maybe move this to Cloud?)
++        """
++        raise NotImplementedError()
++
++    def update_clouds(self):
++        """Update public cloud info available to Juju.
++
++        """
++        raise NotImplementedError()
++
++    def version(self):
++        """Return the Juju version.
++
++        """
++        raise NotImplementedError()
index 0000000,0000000..4abedfc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,42 @@@
++import asyncio
++import signal
++
++
++def run(*steps):
++    """
++    Helper to run one or more async functions synchronously, with graceful
++    handling of SIGINT / Ctrl-C.
++
++    Returns the return value of the last function.
++    """
++    if not steps:
++        return
++
++    task = None
++    run._sigint = False  # function attr to allow setting from closure
++    loop = asyncio.get_event_loop()
++
++    def abort():
++        task.cancel()
++        run._sigint = True
++
++    added = False
++    try:
++        loop.add_signal_handler(signal.SIGINT, abort)
++        added = True
++    except ValueError as e:
++        # add_signal_handler doesn't work in a thread
++        if 'main thread' not in str(e):
++            raise
++    try:
++        for step in steps:
++            task = loop.create_task(step)
++            loop.run_until_complete(asyncio.wait([task], loop=loop))
++            if run._sigint:
++                raise KeyboardInterrupt()
++            if task.exception():
++                raise task.exception()
++        return task.result()
++    finally:
++        if added:
++            loop.remove_signal_handler(signal.SIGINT)
index 0000000,0000000..23b41c6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,262 @@@
++import asyncio
++import logging
++import os
++
++from dateutil.parser import parse as parse_date
++
++from . import model, utils
++from .client import client
++from .errors import JujuError
++
++log = logging.getLogger(__name__)
++
++
++class Machine(model.ModelEntity):
++    def __init__(self, *args, **kwargs):
++        super().__init__(*args, **kwargs)
++        self.on_change(self._workaround_1695335)
++
++    async def _workaround_1695335(self, delta, old, new, model):
++        """
++        This is a (hacky) temporary work around for a bug in Juju where the
++        instance status and agent version fields don't get updated properly
++        by the AllWatcher.
++
++        Deltas never contain a value for `data['agent-status']['version']`,
++        and once the `instance-status` reaches `pending`, we no longer get
++        any updates for it (the deltas come in, but the `instance-status`
++        data is always the same after that).
++
++        To work around this, whenever a delta comes in for this machine, we
++        query FullStatus and use the data from there if and only if it's newer.
++        Luckily, the timestamps on the `since` field does seem to be accurate.
++
++        See https://bugs.launchpad.net/juju/+bug/1695335
++        """
++        if delta.data.get('synthetic', False):
++            # prevent infinite loops re-processing already processed deltas
++            return
++
++        full_status = await utils.run_with_interrupt(model.get_status(),
++                                                     model._watch_stopping,
++                                                     model.loop)
++        if model._watch_stopping.is_set():
++            return
++
++        if self.id not in full_status.machines:
++            return
++
++        if not full_status.machines[self.id]['instance-status']['since']:
++            return
++
++        machine = full_status.machines[self.id]
++
++        change_log = []
++        key_map = {
++            'status': 'current',
++            'info': 'message',
++            'since': 'since',
++        }
++
++        # handle agent version specially, because it's never set in
++        # deltas, and we don't want even a newer delta to clear it
++        agent_version = machine['agent-status']['version']
++        if agent_version:
++            delta.data['agent-status']['version'] = agent_version
++            change_log.append(('agent-version', '', agent_version))
++
++        # only update (other) delta fields if status data is newer
++        status_since = parse_date(machine['instance-status']['since'])
++        delta_since = parse_date(delta.data['instance-status']['since'])
++        if status_since > delta_since:
++            for status_key in ('status', 'info', 'since'):
++                delta_key = key_map[status_key]
++                status_value = machine['instance-status'][status_key]
++                delta_value = delta.data['instance-status'][delta_key]
++                change_log.append((delta_key, delta_value, status_value))
++                delta.data['instance-status'][delta_key] = status_value
++
++        if change_log:
++            log.debug('Overriding machine delta with FullStatus data')
++            for log_item in change_log:
++                log.debug('    {}: {} -> {}'.format(*log_item))
++            delta.data['synthetic'] = True
++            old_obj, new_obj = self.model.state.apply_delta(delta)
++            await model._notify_observers(delta, old_obj, new_obj)
++
++    async def destroy(self, force=False):
++        """Remove this machine from the model.
++
++        Blocks until the machine is actually removed.
++
++        """
++        facade = client.ClientFacade.from_connection(self.connection)
++
++        log.debug(
++            'Destroying machine %s', self.id)
++
++        await facade.DestroyMachines(force, [self.id])
++        return await self.model._wait(
++            'machine', self.id, 'remove')
++    remove = destroy
++
++    def run(self, command, timeout=None):
++        """Run command on this machine.
++
++        :param str command: The command to run
++        :param int timeout: Time to wait before command is considered failed
++
++        """
++        raise NotImplementedError()
++
++    async def set_annotations(self, annotations):
++        """Set annotations on this machine.
++
++        :param annotations map[string]string: the annotations as key/value
++            pairs.
++
++        """
++        log.debug('Updating annotations on machine %s', self.id)
++
++        self.ann_facade = client.AnnotationsFacade.from_connection(
++            self.connection)
++
++        ann = client.EntityAnnotations(
++            entity=self.id,
++            annotations=annotations,
++        )
++        return await self.ann_facade.Set([ann])
++
++    async def scp_to(self, source, destination, user='ubuntu', proxy=False,
++                     scp_opts=''):
++        """Transfer files to this machine.
++
++        :param str source: Local path of file(s) to transfer
++        :param str destination: Remote destination of transferred files
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str scp_opts: Additional options to the `scp` command
++        """
++        if proxy:
++            raise NotImplementedError('proxy option is not implemented')
++
++        address = self.dns_name
++        destination = '%s@%s:%s' % (user, address, destination)
++        await self._scp(source, destination, scp_opts)
++
++    async def scp_from(self, source, destination, user='ubuntu', proxy=False,
++                       scp_opts=''):
++        """Transfer files from this machine.
++
++        :param str source: Remote path of file(s) to transfer
++        :param str destination: Local destination of transferred files
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str scp_opts: Additional options to the `scp` command
++        """
++        if proxy:
++            raise NotImplementedError('proxy option is not implemented')
++
++        address = self.dns_name
++        source = '%s@%s:%s' % (user, address, source)
++        await self._scp(source, destination, scp_opts)
++
++    async def _scp(self, source, destination, scp_opts):
++        """ Execute an scp command. Requires a fully qualified source and
++        destination.
++        """
++        cmd = [
++            'scp',
++            '-i', os.path.expanduser('~/.local/share/juju/ssh/juju_id_rsa'),
++            '-o', 'StrictHostKeyChecking=no',
++            source, destination
++        ]
++        cmd += scp_opts.split()
++        loop = self.model.loop
++        process = await asyncio.create_subprocess_exec(*cmd, loop=loop)
++        await process.wait()
++        if process.returncode != 0:
++            raise JujuError("command failed: %s" % cmd)
++
++    def ssh(
++            self, command, user=None, proxy=False, ssh_opts=None):
++        """Execute a command over SSH on this machine.
++
++        :param str command: Command to execute
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str ssh_opts: Additional options to the `ssh` command
++
++        """
++        raise NotImplementedError()
++
++    def status_history(self, num=20, utc=False):
++        """Get status history for this machine.
++
++        :param int num: Size of history backlog
++        :param bool utc: Display time as UTC in RFC3339 format
++
++        """
++        raise NotImplementedError()
++
++    @property
++    def agent_status(self):
++        """Returns the current Juju agent status string.
++
++        """
++        return self.safe_data['agent-status']['current']
++
++    @property
++    def agent_status_since(self):
++        """Get the time when the `agent_status` was last updated.
++
++        """
++        return parse_date(self.safe_data['agent-status']['since'])
++
++    @property
++    def agent_version(self):
++        """Get the version of the Juju machine agent.
++
++        May return None if the agent is not yet available.
++        """
++        version = self.safe_data['agent-status']['version']
++        if version:
++            return client.Number.from_json(version)
++        else:
++            return None
++
++    @property
++    def status(self):
++        """Returns the current machine provisioning status string.
++
++        """
++        return self.safe_data['instance-status']['current']
++
++    @property
++    def status_message(self):
++        """Returns the current machine provisioning status message.
++
++        """
++        return self.safe_data['instance-status']['message']
++
++    @property
++    def status_since(self):
++        """Get the time when the `status` was last updated.
++
++        """
++        return parse_date(self.safe_data['instance-status']['since'])
++
++    @property
++    def dns_name(self):
++        """Get the DNS name for this machine. This is a best guess based on the
++        addresses available in current data.
++
++        May return None if no suitable address is found.
++        """
++        for scope in ['public', 'local-cloud']:
++            addresses = self.safe_data['addresses'] or []
++            addresses = [address for address in addresses
++                         if address['scope'] == scope]
++            if addresses:
++                return addresses[0]['value']
++        return None
index 0000000,0000000..bd8709a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2031 @@@
++import asyncio
++import base64
++import collections
++import hashlib
++import json
++import logging
++import os
++import re
++import stat
++import tempfile
++import weakref
++import zipfile
++from concurrent.futures import CancelledError
++from functools import partial
++from pathlib import Path
++
++import websockets
++import yaml
++import theblues.charmstore
++import theblues.errors
++
++from . import tag, utils
++from .client import client
++from .client import connection
++from .client.client import ConfigValue
++from .constraints import parse as parse_constraints, normalize_key
++from .delta import get_entity_delta
++from .delta import get_entity_class
++from .exceptions import DeadEntityException
++from .errors import JujuError, JujuAPIError
++from .placement import parse as parse_placement
++
++log = logging.getLogger(__name__)
++
++
++class _Observer(object):
++    """Wrapper around an observer callable.
++
++    This wrapper allows filter criteria to be associated with the
++    callable so that it's only called for changes that meet the criteria.
++
++    """
++    def __init__(self, callable_, entity_type, action, entity_id, predicate):
++        self.callable_ = callable_
++        self.entity_type = entity_type
++        self.action = action
++        self.entity_id = entity_id
++        self.predicate = predicate
++        if self.entity_id:
++            self.entity_id = str(self.entity_id)
++            if not self.entity_id.startswith('^'):
++                self.entity_id = '^' + self.entity_id
++            if not self.entity_id.endswith('$'):
++                self.entity_id += '$'
++
++    async def __call__(self, delta, old, new, model):
++        await self.callable_(delta, old, new, model)
++
++    def cares_about(self, delta):
++        """Return True if this observer "cares about" (i.e. wants to be
++        called) for a this delta.
++
++        """
++        if (self.entity_id and delta.get_id() and
++                not re.match(self.entity_id, str(delta.get_id()))):
++            return False
++
++        if self.entity_type and self.entity_type != delta.entity:
++            return False
++
++        if self.action and self.action != delta.type:
++            return False
++
++        if self.predicate and not self.predicate(delta):
++            return False
++
++        return True
++
++
++class ModelObserver(object):
++    """
++    Base class for creating observers that react to changes in a model.
++    """
++    async def __call__(self, delta, old, new, model):
++        handler_name = 'on_{}_{}'.format(delta.entity, delta.type)
++        method = getattr(self, handler_name, self.on_change)
++        await method(delta, old, new, model)
++
++    async def on_change(self, delta, old, new, model):
++        """Generic model-change handler.
++
++        This should be overridden in a subclass.
++
++        :param delta: :class:`juju.client.overrides.Delta`
++        :param old: :class:`juju.model.ModelEntity`
++        :param new: :class:`juju.model.ModelEntity`
++        :param model: :class:`juju.model.Model`
++
++        """
++        pass
++
++
++class ModelState(object):
++    """Holds the state of the model, including the delta history of all
++    entities in the model.
++
++    """
++    def __init__(self, model):
++        self.model = model
++        self.state = dict()
++
++    def _live_entity_map(self, entity_type):
++        """Return an id:Entity map of all the living entities of
++        type ``entity_type``.
++
++        """
++        return {
++            entity_id: self.get_entity(entity_type, entity_id)
++            for entity_id, history in self.state.get(entity_type, {}).items()
++            if history[-1] is not None
++        }
++
++    @property
++    def applications(self):
++        """Return a map of application-name:Application for all applications
++        currently in the model.
++
++        """
++        return self._live_entity_map('application')
++
++    @property
++    def machines(self):
++        """Return a map of machine-id:Machine for all machines currently in
++        the model.
++
++        """
++        return self._live_entity_map('machine')
++
++    @property
++    def units(self):
++        """Return a map of unit-id:Unit for all units currently in
++        the model.
++
++        """
++        return self._live_entity_map('unit')
++
++    def entity_history(self, entity_type, entity_id):
++        """Return the history deque for an entity.
++
++        """
++        return self.state[entity_type][entity_id]
++
++    def entity_data(self, entity_type, entity_id, history_index):
++        """Return the data dict for an entity at a specific index of its
++        history.
++
++        """
++        return self.entity_history(entity_type, entity_id)[history_index]
++
++    def apply_delta(self, delta):
++        """Apply delta to our state and return a copy of the
++        affected object as it was before and after the update, e.g.:
++
++            old_obj, new_obj = self.apply_delta(delta)
++
++        old_obj may be None if the delta is for the creation of a new object,
++        e.g. a new application or unit is deployed.
++
++        new_obj will never be None, but may be dead (new_obj.dead == True)
++        if the object was deleted as a result of the delta being applied.
++
++        """
++        history = (
++            self.state
++            .setdefault(delta.entity, {})
++            .setdefault(delta.get_id(), collections.deque())
++        )
++
++        history.append(delta.data)
++        if delta.type == 'remove':
++            history.append(None)
++
++        entity = self.get_entity(delta.entity, delta.get_id())
++        return entity.previous(), entity
++
++    def get_entity(
++            self, entity_type, entity_id, history_index=-1, connected=True):
++        """Return an object instance for the given entity_type and id.
++
++        By default the object state matches the most recent state from
++        Juju. To get an instance of the object in an older state, pass
++        history_index, an index into the history deque for the entity.
++
++        """
++
++        if history_index < 0 and history_index != -1:
++            history_index += len(self.entity_history(entity_type, entity_id))
++            if history_index < 0:
++                return None
++
++        try:
++            self.entity_data(entity_type, entity_id, history_index)
++        except IndexError:
++            return None
++
++        entity_class = get_entity_class(entity_type)
++        return entity_class(
++            entity_id, self.model, history_index=history_index,
++            connected=connected)
++
++
++class ModelEntity(object):
++    """An object in the Model tree"""
++
++    def __init__(self, entity_id, model, history_index=-1, connected=True):
++        """Initialize a new entity
++
++        :param entity_id str: The unique id of the object in the model
++        :param model: The model instance in whose object tree this
++            entity resides
++        :history_index int: The index of this object's state in the model's
++            history deque for this entity
++        :connected bool: Flag indicating whether this object gets live updates
++            from the model.
++
++        """
++        self.entity_id = entity_id
++        self.model = model
++        self._history_index = history_index
++        self.connected = connected
++        self.connection = model.connection
++
++    def __repr__(self):
++        return '<{} entity_id="{}">'.format(type(self).__name__,
++                                            self.entity_id)
++
++    def __getattr__(self, name):
++        """Fetch object attributes from the underlying data dict held in the
++        model.
++
++        """
++        try:
++            return self.safe_data[name]
++        except KeyError:
++            name = name.replace('_', '-')
++            if name in self.safe_data:
++                return self.safe_data[name]
++            else:
++                raise
++
++    def __bool__(self):
++        return bool(self.data)
++
++    def on_change(self, callable_):
++        """Add a change observer to this entity.
++
++        """
++        self.model.add_observer(
++            callable_, self.entity_type, 'change', self.entity_id)
++
++    def on_remove(self, callable_):
++        """Add a remove observer to this entity.
++
++        """
++        self.model.add_observer(
++            callable_, self.entity_type, 'remove', self.entity_id)
++
++    @property
++    def entity_type(self):
++        """A string identifying the entity type of this object, e.g.
++        'application' or 'unit', etc.
++
++        """
++        return self.__class__.__name__.lower()
++
++    @property
++    def current(self):
++        """Return True if this object represents the current state of the
++        entity in the underlying model.
++
++        This will be True except when the object represents an entity at a
++        non-latest state in history, e.g. if the object was obtained by calling
++        .previous() on another object.
++
++        """
++        return self._history_index == -1
++
++    @property
++    def dead(self):
++        """Returns True if this entity no longer exists in the underlying
++        model.
++
++        """
++        return (
++            self.data is None or
++            self.model.state.entity_data(
++                self.entity_type, self.entity_id, -1) is None
++        )
++
++    @property
++    def alive(self):
++        """Returns True if this entity still exists in the underlying
++        model.
++
++        """
++        return not self.dead
++
++    @property
++    def data(self):
++        """The data dictionary for this entity.
++
++        """
++        return self.model.state.entity_data(
++            self.entity_type, self.entity_id, self._history_index)
++
++    @property
++    def safe_data(self):
++        """The data dictionary for this entity.
++
++        If this `ModelEntity` points to the dead state, it will
++        raise `DeadEntityException`.
++
++        """
++        if self.data is None:
++            raise DeadEntityException(
++                "Entity {}:{} is dead - its attributes can no longer be "
++                "accessed. Use the .previous() method on this object to get "
++                "a copy of the object at its previous state.".format(
++                    self.entity_type, self.entity_id))
++        return self.data
++
++    def previous(self):
++        """Return a copy of this object as was at its previous state in
++        history.
++
++        Returns None if this object is new (and therefore has no history).
++
++        The returned object is always "disconnected", i.e. does not receive
++        live updates.
++
++        """
++        return self.model.state.get_entity(
++            self.entity_type, self.entity_id, self._history_index - 1,
++            connected=False)
++
++    def next(self):
++        """Return a copy of this object at its next state in
++        history.
++
++        Returns None if this object is already the latest.
++
++        The returned object is "disconnected", i.e. does not receive
++        live updates, unless it is current (latest).
++
++        """
++        if self._history_index == -1:
++            return None
++
++        new_index = self._history_index + 1
++        connected = (
++            new_index == len(self.model.state.entity_history(
++                self.entity_type, self.entity_id)) - 1
++        )
++        return self.model.state.get_entity(
++            self.entity_type, self.entity_id, self._history_index - 1,
++            connected=connected)
++
++    def latest(self):
++        """Return a copy of this object at its current state in the model.
++
++        Returns self if this object is already the latest.
++
++        The returned object is always "connected", i.e. receives
++        live updates from the model.
++
++        """
++        if self._history_index == -1:
++            return self
++
++        return self.model.state.get_entity(self.entity_type, self.entity_id)
++
++
++class Model(object):
++    """
++    The main API for interacting with a Juju model.
++    """
++    def __init__(self, loop=None,
++                 max_frame_size=connection.Connection.DEFAULT_FRAME_SIZE):
++        """Instantiate a new connected Model.
++
++        :param loop: an asyncio event loop
++        :param max_frame_size: See
++            `juju.client.connection.Connection.MAX_FRAME_SIZE`
++
++        """
++        self.loop = loop or asyncio.get_event_loop()
++        self.max_frame_size = max_frame_size
++        self.connection = None
++        self.observers = weakref.WeakValueDictionary()
++        self.state = ModelState(self)
++        self.info = None
++        self._watch_stopping = asyncio.Event(loop=self.loop)
++        self._watch_stopped = asyncio.Event(loop=self.loop)
++        self._watch_received = asyncio.Event(loop=self.loop)
++        self._charmstore = CharmStore(self.loop)
++
++    async def __aenter__(self):
++        await self.connect_current()
++        return self
++
++    async def __aexit__(self, exc_type, exc, tb):
++        await self.disconnect()
++
++        if exc_type is not None:
++            return False
++
++    async def connect(self, *args, **kw):
++        """Connect to an arbitrary Juju model.
++
++        args and kw are passed through to Connection.connect()
++
++        """
++        if 'loop' not in kw:
++            kw['loop'] = self.loop
++        if 'max_frame_size' not in kw:
++            kw['max_frame_size'] = self.max_frame_size
++        self.connection = await connection.Connection.connect(*args, **kw)
++        await self._after_connect()
++
++    async def connect_current(self):
++        """Connect to the current Juju model.
++
++        """
++        self.connection = await connection.Connection.connect_current(
++            self.loop, max_frame_size=self.max_frame_size)
++        await self._after_connect()
++
++    async def connect_model(self, model_name):
++        """Connect to a specific Juju model by name.
++
++        :param model_name:  Format [controller:][user/]model
++
++        """
++        self.connection = await connection.Connection.connect_model(
++            model_name, self.loop, self.max_frame_size)
++        await self._after_connect()
++
++    async def _after_connect(self):
++        """Run initialization steps after connecting to websocket.
++
++        """
++        self._watch()
++        await self._watch_received.wait()
++        await self.get_info()
++
++    async def disconnect(self):
++        """Shut down the watcher task and close websockets.
++
++        """
++        if self.connection and self.connection.is_open:
++            log.debug('Stopping watcher task')
++            self._watch_stopping.set()
++            await self._watch_stopped.wait()
++            log.debug('Closing model connection')
++            await self.connection.close()
++            self.connection = None
++
++    async def add_local_charm_dir(self, charm_dir, series):
++        """Upload a local charm to the model.
++
++        This will automatically generate an archive from
++        the charm dir.
++
++        :param charm_dir: Path to the charm directory
++        :param series: Charm series
++
++        """
++        fh = tempfile.NamedTemporaryFile()
++        CharmArchiveGenerator(charm_dir).make_archive(fh.name)
++        with fh:
++            func = partial(
++                self.add_local_charm, fh, series, os.stat(fh.name).st_size)
++            charm_url = await self.loop.run_in_executor(None, func)
++
++        log.debug('Uploaded local charm: %s -> %s', charm_dir, charm_url)
++        return charm_url
++
++    def add_local_charm(self, charm_file, series, size=None):
++        """Upload a local charm archive to the model.
++
++        Returns the 'local:...' url that should be used to deploy the charm.
++
++        :param charm_file: Path to charm zip archive
++        :param series: Charm series
++        :param size: Size of the archive, in bytes
++        :return str: 'local:...' url for deploying the charm
++        :raises: :class:`JujuError` if the upload fails
++
++        Uses an https endpoint at the same host:port as the wss.
++        Supports large file uploads.
++
++        .. warning::
++
++           This method will block. Consider using :meth:`add_local_charm_dir`
++           instead.
++
++        """
++        conn, headers, path_prefix = self.connection.https_connection()
++        path = "%s/charms?series=%s" % (path_prefix, series)
++        headers['Content-Type'] = 'application/zip'
++        if size:
++            headers['Content-Length'] = size
++        conn.request("POST", path, charm_file, headers)
++        response = conn.getresponse()
++        result = response.read().decode()
++        if not response.status == 200:
++            raise JujuError(result)
++        result = json.loads(result)
++        return result['charm-url']
++
++    def all_units_idle(self):
++        """Return True if all units are idle.
++
++        """
++        for unit in self.units.values():
++            unit_status = unit.data['agent-status']['current']
++            if unit_status != 'idle':
++                return False
++        return True
++
++    async def reset(self, force=False):
++        """Reset the model to a clean state.
++
++        :param bool force: Force-terminate machines.
++
++        This returns only after the model has reached a clean state. "Clean"
++        means no applications or machines exist in the model.
++
++        """
++        log.debug('Resetting model')
++        for app in self.applications.values():
++            await app.destroy()
++        for machine in self.machines.values():
++            await machine.destroy(force=force)
++        await self.block_until(
++            lambda: len(self.machines) == 0
++        )
++
++    async def block_until(self, *conditions, timeout=None, wait_period=0.5):
++        """Return only after all conditions are true.
++
++        """
++        async def _block():
++            while not all(c() for c in conditions):
++                if not (self.connection and self.connection.is_open):
++                    raise websockets.ConnectionClosed(1006, 'no reason')
++                await asyncio.sleep(wait_period, loop=self.loop)
++        await asyncio.wait_for(_block(), timeout, loop=self.loop)
++
++    @property
++    def applications(self):
++        """Return a map of application-name:Application for all applications
++        currently in the model.
++
++        """
++        return self.state.applications
++
++    @property
++    def machines(self):
++        """Return a map of machine-id:Machine for all machines currently in
++        the model.
++
++        """
++        return self.state.machines
++
++    @property
++    def units(self):
++        """Return a map of unit-id:Unit for all units currently in
++        the model.
++
++        """
++        return self.state.units
++
++    async def get_info(self):
++        """Return a client.ModelInfo object for this Model.
++
++        Retrieves latest info for this Model from the api server. The
++        return value is cached on the Model.info attribute so that the
++        valued may be accessed again without another api call, if
++        desired.
++
++        This method is called automatically when the Model is connected,
++        resulting in Model.info being initialized without requiring an
++        explicit call to this method.
++
++        """
++        facade = client.ClientFacade.from_connection(self.connection)
++
++        self.info = await facade.ModelInfo()
++        log.debug('Got ModelInfo: %s', vars(self.info))
++
++        return self.info
++
++    def add_observer(
++            self, callable_, entity_type=None, action=None, entity_id=None,
++            predicate=None):
++        """Register an "on-model-change" callback
++
++        Once the model is connected, ``callable_``
++        will be called each time the model changes. ``callable_`` should
++        be Awaitable and accept the following positional arguments:
++
++            delta - An instance of :class:`juju.delta.EntityDelta`
++                containing the raw delta data recv'd from the Juju
++                websocket.
++
++            old_obj - If the delta modifies an existing object in the model,
++                old_obj will be a copy of that object, as it was before the
++                delta was applied. Will be None if the delta creates a new
++                entity in the model.
++
++            new_obj - A copy of the new or updated object, after the delta
++                is applied. Will be None if the delta removes an entity
++                from the model.
++
++            model - The :class:`Model` itself.
++
++        Events for which ``callable_`` is called can be specified by passing
++        entity_type, action, and/or entitiy_id filter criteria, e.g.::
++
++            add_observer(
++                myfunc,
++                entity_type='application', action='add', entity_id='ubuntu')
++
++        For more complex filtering conditions, pass a predicate function. It
++        will be called with a delta as its only argument. If the predicate
++        function returns True, the ``callable_`` will be called.
++
++        """
++        observer = _Observer(
++            callable_, entity_type, action, entity_id, predicate)
++        self.observers[observer] = callable_
++
++    def _watch(self):
++        """Start an asynchronous watch against this model.
++
++        See :meth:`add_observer` to register an onchange callback.
++
++        """
++        async def _all_watcher():
++            try:
++                allwatcher = client.AllWatcherFacade.from_connection(
++                    self.connection)
++                while not self._watch_stopping.is_set():
++                    try:
++                        results = await utils.run_with_interrupt(
++                            allwatcher.Next(),
++                            self._watch_stopping,
++                            self.loop)
++                    except JujuAPIError as e:
++                        if 'watcher was stopped' not in str(e):
++                            raise
++                        if self._watch_stopping.is_set():
++                            # this shouldn't ever actually happen, because
++                            # the event should trigger before the controller
++                            # has a chance to tell us the watcher is stopped
++                            # but handle it gracefully, just in case
++                            break
++                        # controller stopped our watcher for some reason
++                        # but we're not actually stopping, so just restart it
++                        log.warning(
++                            'Watcher: watcher stopped, restarting')
++                        del allwatcher.Id
++                        continue
++                    except websockets.ConnectionClosed:
++                        monitor = self.connection.monitor
++                        if monitor.status == monitor.ERROR:
++                            # closed unexpectedly, try to reopen
++                            log.warning(
++                                'Watcher: connection closed, reopening')
++                            await self.connection.reconnect()
++                            del allwatcher.Id
++                            continue
++                        else:
++                            # closed on request, go ahead and shutdown
++                            break
++                    if self._watch_stopping.is_set():
++                        await allwatcher.Stop()
++                        break
++                    for delta in results.deltas:
++                        delta = get_entity_delta(delta)
++                        old_obj, new_obj = self.state.apply_delta(delta)
++                        await self._notify_observers(delta, old_obj, new_obj)
++                    self._watch_received.set()
++            except CancelledError:
++                pass
++            except Exception:
++                log.exception('Error in watcher')
++                raise
++            finally:
++                self._watch_stopped.set()
++
++        log.debug('Starting watcher task')
++        self._watch_received.clear()
++        self._watch_stopping.clear()
++        self._watch_stopped.clear()
++        self.loop.create_task(_all_watcher())
++
++    async def _notify_observers(self, delta, old_obj, new_obj):
++        """Call observing callbacks, notifying them of a change in model state
++
++        :param delta: The raw change from the watcher
++            (:class:`juju.client.overrides.Delta`)
++        :param old_obj: The object in the model that this delta updates.
++            May be None.
++        :param new_obj: The object in the model that is created or updated
++            by applying this delta.
++
++        """
++        if new_obj and not old_obj:
++            delta.type = 'add'
++
++        log.debug(
++            'Model changed: %s %s %s',
++            delta.entity, delta.type, delta.get_id())
++
++        for o in self.observers:
++            if o.cares_about(delta):
++                asyncio.ensure_future(o(delta, old_obj, new_obj, self),
++                                      loop=self.loop)
++
++    async def _wait(self, entity_type, entity_id, action, predicate=None):
++        """
++        Block the calling routine until a given action has happened to the
++        given entity
++
++        :param entity_type: The entity's type.
++        :param entity_id: The entity's id.
++        :param action: the type of action (e.g., 'add', 'change', or 'remove')
++        :param predicate: optional callable that must take as an
++            argument a delta, and must return a boolean, indicating
++            whether the delta contains the specific action we're looking
++            for. For example, you might check to see whether a 'change'
++            has a 'completed' status. See the _Observer class for details.
++
++        """
++        q = asyncio.Queue(loop=self.loop)
++
++        async def callback(delta, old, new, model):
++            await q.put(delta.get_id())
++
++        self.add_observer(callback, entity_type, action, entity_id, predicate)
++        entity_id = await q.get()
++        # object might not be in the entity_map if we were waiting for a
++        # 'remove' action
++        return self.state._live_entity_map(entity_type).get(entity_id)
++
++    async def _wait_for_new(self, entity_type, entity_id=None, predicate=None):
++        """Wait for a new object to appear in the Model and return it.
++
++        Waits for an object of type ``entity_type`` with id ``entity_id``.
++        If ``entity_id`` is ``None``, it will wait for the first new entity
++        of the correct type.
++
++        This coroutine blocks until the new object appears in the model.
++
++        """
++        # if the entity is already in the model, just return it
++        if entity_id in self.state._live_entity_map(entity_type):
++            return self.state._live_entity_map(entity_type)[entity_id]
++        # if we know the entity_id, we can trigger on any action that puts
++        # the enitty into the model; otherwise, we have to watch for the
++        # next "add" action on that entity_type
++        action = 'add' if entity_id is None else None
++        return await self._wait(entity_type, entity_id, action, predicate)
++
++    async def wait_for_action(self, action_id):
++        """Given an action, wait for it to complete."""
++
++        if action_id.startswith("action-"):
++            # if we've been passed action.tag, transform it into the
++            # id that the api deltas will use.
++            action_id = action_id[7:]
++
++        def predicate(delta):
++            return delta.data['status'] in ('completed', 'failed')
++
++        return await self._wait('action', action_id, 'change', predicate)
++
++    async def add_machine(
++            self, spec=None, constraints=None, disks=None, series=None):
++        """Start a new, empty machine and optionally a container, or add a
++        container to a machine.
++
++        :param str spec: Machine specification
++            Examples::
++
++                (None) - starts a new machine
++                'lxd' - starts a new machine with one lxd container
++                'lxd:4' - starts a new lxd container on machine 4
++                'ssh:user@10.10.0.3' - manually provisions a machine with ssh
++                'zone=us-east-1a' - starts a machine in zone us-east-1s on AWS
++                'maas2.name' - acquire machine maas2.name on MAAS
++
++        :param dict constraints: Machine constraints, which can contain the
++            the following keys::
++
++                arch : str
++                container : str
++                cores : int
++                cpu_power : int
++                instance_type : str
++                mem : int
++                root_disk : int
++                spaces : list(str)
++                tags : list(str)
++                virt_type : str
++
++            Example::
++
++                constraints={
++                    'mem': 256 * MB,
++                    'tags': ['virtual'],
++                }
++
++        :param list disks: List of disk constraint dictionaries, which can
++            contain the following keys::
++
++                count : int
++                pool : str
++                size : int
++
++            Example::
++
++                disks=[{
++                    'pool': 'rootfs',
++                    'size': 10 * GB,
++                    'count': 1,
++                }]
++
++        :param str series: Series, e.g. 'xenial'
++
++        Supported container types are: lxd, kvm
++
++        When deploying a container to an existing machine, constraints cannot
++        be used.
++
++        """
++        params = client.AddMachineParams()
++        params.jobs = ['JobHostUnits']
++
++        if spec:
++            placement = parse_placement(spec)
++            if placement:
++                params.placement = placement[0]
++
++        if constraints:
++            params.constraints = client.Value.from_json(constraints)
++
++        if disks:
++            params.disks = [
++                client.Constraints.from_json(o) for o in disks]
++
++        if series:
++            params.series = series
++
++        # Submit the request.
++        client_facade = client.ClientFacade.from_connection(self.connection)
++        results = await client_facade.AddMachines([params])
++        error = results.machines[0].error
++        if error:
++            raise ValueError("Error adding machine: %s" % error.message)
++        machine_id = results.machines[0].machine
++        log.debug('Added new machine %s', machine_id)
++        return await self._wait_for_new('machine', machine_id)
++
++    async def add_relation(self, relation1, relation2):
++        """Add a relation between two applications.
++
++        :param str relation1: '<application>[:<relation_name>]'
++        :param str relation2: '<application>[:<relation_name>]'
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Adding relation %s <-> %s', relation1, relation2)
++
++        try:
++            result = await app_facade.AddRelation([relation1, relation2])
++        except JujuAPIError as e:
++            if 'relation already exists' not in e.message:
++                raise
++            log.debug(
++                'Relation %s <-> %s already exists', relation1, relation2)
++            # TODO: if relation already exists we should return the
++            # Relation ModelEntity here
++            return None
++
++        def predicate(delta):
++            endpoints = {}
++            for endpoint in delta.data['endpoints']:
++                endpoints[endpoint['application-name']] = endpoint['relation']
++            return endpoints == result.endpoints
++
++        return await self._wait_for_new('relation', None, predicate)
++
++    def add_space(self, name, *cidrs):
++        """Add a new network space.
++
++        Adds a new space with the given name and associates the given
++        (optional) list of existing subnet CIDRs with it.
++
++        :param str name: Name of the space
++        :param \*cidrs: Optional list of existing subnet CIDRs
++
++        """
++        raise NotImplementedError()
++
++    async def add_ssh_key(self, user, key):
++        """Add a public SSH key to this model.
++
++        :param str user: The username of the user
++        :param str key: The public ssh key
++
++        """
++        key_facade = client.KeyManagerFacade.from_connection(self.connection)
++        return await key_facade.AddKeys([key], user)
++    add_ssh_keys = add_ssh_key
++
++    def add_subnet(self, cidr_or_id, space, *zones):
++        """Add an existing subnet to this model.
++
++        :param str cidr_or_id: CIDR or provider ID of the existing subnet
++        :param str space: Network space with which to associate
++        :param str \*zones: Zone(s) in which the subnet resides
++
++        """
++        raise NotImplementedError()
++
++    def get_backups(self):
++        """Retrieve metadata for backups in this model.
++
++        """
++        raise NotImplementedError()
++
++    def block(self, *commands):
++        """Add a new block to this model.
++
++        :param str \*commands: The commands to block. Valid values are
++            'all-changes', 'destroy-model', 'remove-object'
++
++        """
++        raise NotImplementedError()
++
++    def get_blocks(self):
++        """List blocks for this model.
++
++        """
++        raise NotImplementedError()
++
++    def get_cached_images(self, arch=None, kind=None, series=None):
++        """Return a list of cached OS images.
++
++        :param str arch: Filter by image architecture
++        :param str kind: Filter by image kind, e.g. 'lxd'
++        :param str series: Filter by image series, e.g. 'xenial'
++
++        """
++        raise NotImplementedError()
++
++    def create_backup(self, note=None, no_download=False):
++        """Create a backup of this model.
++
++        :param str note: A note to store with the backup
++        :param bool no_download: Do not download the backup archive
++        :return str: Path to downloaded archive
++
++        """
++        raise NotImplementedError()
++
++    def create_storage_pool(self, name, provider_type, **pool_config):
++        """Create or define a storage pool.
++
++        :param str name: Name to give the storage pool
++        :param str provider_type: Pool provider type
++        :param \*\*pool_config: key/value pool configuration pairs
++
++        """
++        raise NotImplementedError()
++
++    def debug_log(
++            self, no_tail=False, exclude_module=None, include_module=None,
++            include=None, level=None, limit=0, lines=10, replay=False,
++            exclude=None):
++        """Get log messages for this model.
++
++        :param bool no_tail: Stop after returning existing log messages
++        :param list exclude_module: Do not show log messages for these logging
++            modules
++        :param list include_module: Only show log messages for these logging
++            modules
++        :param list include: Only show log messages for these entities
++        :param str level: Log level to show, valid options are 'TRACE',
++            'DEBUG', 'INFO', 'WARNING', 'ERROR,
++        :param int limit: Return this many of the most recent (possibly
++            filtered) lines are shown
++        :param int lines: Yield this many of the most recent lines, and keep
++            yielding
++        :param bool replay: Yield the entire log, and keep yielding
++        :param list exclude: Do not show log messages for these entities
++
++        """
++        raise NotImplementedError()
++
++    def _get_series(self, entity_url, entity):
++        # try to get the series from the provided charm URL
++        if entity_url.startswith('cs:'):
++            parts = entity_url[3:].split('/')
++        else:
++            parts = entity_url.split('/')
++        if parts[0].startswith('~'):
++            parts.pop(0)
++        if len(parts) > 1:
++            # series was specified in the URL
++            return parts[0]
++        # series was not supplied at all, so use the newest
++        # supported series according to the charm store
++        ss = entity['Meta']['supported-series']
++        return ss['SupportedSeries'][0]
++
++    async def deploy(
++            self, entity_url, application_name=None, bind=None, budget=None,
++            channel=None, config=None, constraints=None, force=False,
++            num_units=1, plan=None, resources=None, series=None, storage=None,
++            to=None):
++        """Deploy a new service or bundle.
++
++        :param str entity_url: Charm or bundle url
++        :param str application_name: Name to give the service
++        :param dict bind: <charm endpoint>:<network space> pairs
++        :param dict budget: <budget name>:<limit> pairs
++        :param str channel: Charm store channel from which to retrieve
++            the charm or bundle, e.g. 'edge'
++        :param dict config: Charm configuration dictionary
++        :param constraints: Service constraints
++        :type constraints: :class:`juju.Constraints`
++        :param bool force: Allow charm to be deployed to a machine running
++            an unsupported series
++        :param int num_units: Number of units to deploy
++        :param str plan: Plan under which to deploy charm
++        :param dict resources: <resource name>:<file path> pairs
++        :param str series: Series on which to deploy
++        :param dict storage: Storage constraints TODO how do these look?
++        :param to: Placement directive as a string. For example:
++
++            '23' - place on machine 23
++            'lxd:7' - place in new lxd container on machine 7
++            '24/lxd/3' - place in container 3 on machine 24
++
++            If None, a new machine is provisioned.
++
++
++        TODO::
++
++            - support local resources
++
++        """
++        if storage:
++            storage = {
++                k: client.Constraints(**v)
++                for k, v in storage.items()
++            }
++
++        is_local = (
++            entity_url.startswith('local:') or
++            os.path.isdir(entity_url)
++        )
++        if is_local:
++            entity_id = entity_url.replace('local:', '')
++        else:
++            entity = await self.charmstore.entity(entity_url, channel=channel)
++            entity_id = entity['Id']
++
++        client_facade = client.ClientFacade.from_connection(self.connection)
++
++        is_bundle = ((is_local and
++                      (Path(entity_id) / 'bundle.yaml').exists()) or
++                     (not is_local and 'bundle/' in entity_id))
++
++        if is_bundle:
++            handler = BundleHandler(self)
++            await handler.fetch_plan(entity_id)
++            await handler.execute_plan()
++            extant_apps = {app for app in self.applications}
++            pending_apps = set(handler.applications) - extant_apps
++            if pending_apps:
++                # new apps will usually be in the model by now, but if some
++                # haven't made it yet we'll need to wait on them to be added
++                await asyncio.gather(*[
++                    asyncio.ensure_future(
++                        self._wait_for_new('application', app_name),
++                        loop=self.loop)
++                    for app_name in pending_apps
++                ], loop=self.loop)
++            return [app for name, app in self.applications.items()
++                    if name in handler.applications]
++        else:
++            if not is_local:
++                if not application_name:
++                    application_name = entity['Meta']['charm-metadata']['Name']
++                if not series:
++                    series = self._get_series(entity_url, entity)
++                await client_facade.AddCharm(channel, entity_id)
++                # XXX: we're dropping local resources here, but we don't
++                # actually support them yet anyway
++                resources = await self._add_store_resources(application_name,
++                                                            entity_id,
++                                                            entity)
++            else:
++                # We have a local charm dir that needs to be uploaded
++                charm_dir = os.path.abspath(
++                    os.path.expanduser(entity_id))
++                series = series or get_charm_series(charm_dir)
++                if not series:
++                    raise JujuError(
++                        "Couldn't determine series for charm at {}. "
++                        "Pass a 'series' kwarg to Model.deploy().".format(
++                            charm_dir))
++                entity_id = await self.add_local_charm_dir(charm_dir, series)
++            return await self._deploy(
++                charm_url=entity_id,
++                application=application_name,
++                series=series,
++                config=config or {},
++                constraints=constraints,
++                endpoint_bindings=bind,
++                resources=resources,
++                storage=storage,
++                channel=channel,
++                num_units=num_units,
++                placement=parse_placement(to)
++            )
++
++    async def _add_store_resources(self, application, entity_url, entity=None):
++        if not entity:
++            # avoid extra charm store call if one was already made
++            entity = await self.charmstore.entity(entity_url)
++        resources = [
++            {
++                'description': resource['Description'],
++                'fingerprint': resource['Fingerprint'],
++                'name': resource['Name'],
++                'path': resource['Path'],
++                'revision': resource['Revision'],
++                'size': resource['Size'],
++                'type_': resource['Type'],
++                'origin': 'store',
++            } for resource in entity['Meta']['resources']
++        ]
++
++        if not resources:
++            return None
++
++        resources_facade = client.ResourcesFacade.from_connection(
++            self.connection)
++        response = await resources_facade.AddPendingResources(
++            tag.application(application),
++            entity_url,
++            [client.CharmResource(**resource) for resource in resources])
++        resource_map = {resource['name']: pid
++                        for resource, pid
++                        in zip(resources, response.pending_ids)}
++        return resource_map
++
++    async def _deploy(self, charm_url, application, series, config,
++                      constraints, endpoint_bindings, resources, storage,
++                      channel=None, num_units=None, placement=None):
++        """Logic shared between `Model.deploy` and `BundleHandler.deploy`.
++        """
++        log.info('Deploying %s', charm_url)
++
++        # stringify all config values for API, and convert to YAML
++        config = {k: str(v) for k, v in config.items()}
++        config = yaml.dump({application: config},
++                           default_flow_style=False)
++
++        app_facade = client.ApplicationFacade.from_connection(
++            self.connection)
++
++        app = client.ApplicationDeploy(
++            charm_url=charm_url,
++            application=application,
++            series=series,
++            channel=channel,
++            config_yaml=config,
++            constraints=parse_constraints(constraints),
++            endpoint_bindings=endpoint_bindings,
++            num_units=num_units,
++            resources=resources,
++            storage=storage,
++            placement=placement
++        )
++
++        result = await app_facade.Deploy([app])
++        errors = [r.error.message for r in result.results if r.error]
++        if errors:
++            raise JujuError('\n'.join(errors))
++        return await self._wait_for_new('application', application)
++
++    async def destroy(self):
++        """Terminate all machines and resources for this model.
++            Is already implemented in controller.py.
++        """
++        raise NotImplementedError()
++
++    async def destroy_unit(self, *unit_names):
++        """Destroy units by name.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Destroying unit%s %s',
++            's' if len(unit_names) == 1 else '',
++            ' '.join(unit_names))
++
++        return await app_facade.DestroyUnits(list(unit_names))
++    destroy_units = destroy_unit
++
++    def get_backup(self, archive_id):
++        """Download a backup archive file.
++
++        :param str archive_id: The id of the archive to download
++        :return str: Path to the archive file
++
++        """
++        raise NotImplementedError()
++
++    def enable_ha(
++            self, num_controllers=0, constraints=None, series=None, to=None):
++        """Ensure sufficient controllers exist to provide redundancy.
++
++        :param int num_controllers: Number of controllers to make available
++        :param constraints: Constraints to apply to the controller machines
++        :type constraints: :class:`juju.Constraints`
++        :param str series: Series of the controller machines
++        :param list to: Placement directives for controller machines, e.g.::
++
++            '23' - machine 23
++            'lxc:7' - new lxc container on machine 7
++            '24/lxc/3' - lxc container 3 or machine 24
++
++            If None, a new machine is provisioned.
++
++        """
++        raise NotImplementedError()
++
++    async def get_config(self):
++        """Return the configuration settings for this model.
++
++        :returns: A ``dict`` mapping keys to `ConfigValue` instances,
++            which have `source` and `value` attributes.
++        """
++        config_facade = client.ModelConfigFacade.from_connection(
++            self.connection
++        )
++        result = await config_facade.ModelGet()
++        config = result.config
++        for key, value in config.items():
++            config[key] = ConfigValue.from_json(value)
++        return config
++
++    def get_constraints(self):
++        """Return the machine constraints for this model.
++
++        """
++        raise NotImplementedError()
++
++    async def grant(self, username, acl='read'):
++        """Grant a user access to this model.
++
++        :param str username: Username
++        :param str acl: Access control ('read' or 'write')
++
++        """
++        controller_conn = await self.connection.controller()
++        model_facade = client.ModelManagerFacade.from_connection(
++            controller_conn)
++        user = tag.user(username)
++        model = tag.model(self.info.uuid)
++        changes = client.ModifyModelAccess(acl, 'grant', model, user)
++        await self.revoke(username)
++        return await model_facade.ModifyModelAccess([changes])
++
++    def import_ssh_key(self, identity):
++        """Add a public SSH key from a trusted indentity source to this model.
++
++        :param str identity: User identity in the form <lp|gh>:<username>
++
++        """
++        raise NotImplementedError()
++    import_ssh_keys = import_ssh_key
++
++    async def get_machines(self):
++        """Return list of machines in this model.
++
++        """
++        return list(self.state.machines.keys())
++
++    def get_shares(self):
++        """Return list of all users with access to this model.
++
++        """
++        raise NotImplementedError()
++
++    def get_spaces(self):
++        """Return list of all known spaces, including associated subnets.
++
++        """
++        raise NotImplementedError()
++
++    async def get_ssh_key(self, raw_ssh=False):
++        """Return known SSH keys for this model.
++        :param bool raw_ssh: if True, returns the raw ssh key,
++            else it's fingerprint
++
++        """
++        key_facade = client.KeyManagerFacade.from_connection(self.connection)
++        entity = {'tag': tag.model(self.info.uuid)}
++        entities = client.Entities([entity])
++        return await key_facade.ListKeys(entities, raw_ssh)
++    get_ssh_keys = get_ssh_key
++
++    def get_storage(self, filesystem=False, volume=False):
++        """Return details of storage instances.
++
++        :param bool filesystem: Include filesystem storage
++        :param bool volume: Include volume storage
++
++        """
++        raise NotImplementedError()
++
++    def get_storage_pools(self, names=None, providers=None):
++        """Return list of storage pools.
++
++        :param list names: Only include pools with these names
++        :param list providers: Only include pools for these providers
++
++        """
++        raise NotImplementedError()
++
++    def get_subnets(self, space=None, zone=None):
++        """Return list of known subnets.
++
++        :param str space: Only include subnets in this space
++        :param str zone: Only include subnets in this zone
++
++        """
++        raise NotImplementedError()
++
++    def remove_blocks(self):
++        """Remove all blocks from this model.
++
++        """
++        raise NotImplementedError()
++
++    def remove_backup(self, backup_id):
++        """Delete a backup.
++
++        :param str backup_id: The id of the backup to remove
++
++        """
++        raise NotImplementedError()
++
++    def remove_cached_images(self, arch=None, kind=None, series=None):
++        """Remove cached OS images.
++
++        :param str arch: Architecture of the images to remove
++        :param str kind: Image kind to remove, e.g. 'lxd'
++        :param str series: Image series to remove, e.g. 'xenial'
++
++        """
++        raise NotImplementedError()
++
++    def remove_machine(self, *machine_ids):
++        """Remove a machine from this model.
++
++        :param str \*machine_ids: Ids of the machines to remove
++
++        """
++        raise NotImplementedError()
++    remove_machines = remove_machine
++
++    async def remove_ssh_key(self, user, key):
++        """Remove a public SSH key(s) from this model.
++
++        :param str key: Full ssh key
++        :param str user: Juju user to which the key is registered
++
++        """
++        key_facade = client.KeyManagerFacade.from_connection(self.connection)
++        key = base64.b64decode(bytes(key.strip().split()[1].encode('ascii')))
++        key = hashlib.md5(key).hexdigest()
++        key = ':'.join(a+b for a, b in zip(key[::2], key[1::2]))
++        await key_facade.DeleteKeys([key], user)
++    remove_ssh_keys = remove_ssh_key
++
++    def restore_backup(
++            self, bootstrap=False, constraints=None, archive=None,
++            backup_id=None, upload_tools=False):
++        """Restore a backup archive to a new controller.
++
++        :param bool bootstrap: Bootstrap a new state machine
++        :param constraints: Model constraints
++        :type constraints: :class:`juju.Constraints`
++        :param str archive: Path to backup archive to restore
++        :param str backup_id: Id of backup to restore
++        :param bool upload_tools: Upload tools if bootstrapping a new machine
++
++        """
++        raise NotImplementedError()
++
++    def retry_provisioning(self):
++        """Retry provisioning for failed machines.
++
++        """
++        raise NotImplementedError()
++
++    async def revoke(self, username):
++        """Revoke a user's access to this model.
++
++        :param str username: Username to revoke
++
++        """
++        controller_conn = await self.connection.controller()
++        model_facade = client.ModelManagerFacade.from_connection(
++            controller_conn)
++        user = tag.user(username)
++        model = tag.model(self.info.uuid)
++        changes = client.ModifyModelAccess('read', 'revoke', model, user)
++        return await model_facade.ModifyModelAccess([changes])
++
++    def run(self, command, timeout=None):
++        """Run command on all machines in this model.
++
++        :param str command: The command to run
++        :param int timeout: Time to wait before command is considered failed
++
++        """
++        raise NotImplementedError()
++
++    async def set_config(self, config):
++        """Set configuration keys on this model.
++
++        :param dict config: Mapping of config keys to either string values or
++            `ConfigValue` instances, as returned by `get_config`.
++        """
++        config_facade = client.ModelConfigFacade.from_connection(
++            self.connection
++        )
++        for key, value in config.items():
++            if isinstance(value, ConfigValue):
++                config[key] = value.value
++        await config_facade.ModelSet(config)
++
++    def set_constraints(self, constraints):
++        """Set machine constraints on this model.
++
++        :param :class:`juju.Constraints` constraints: Machine constraints
++
++        """
++        raise NotImplementedError()
++
++    def get_action_output(self, action_uuid, wait=-1):
++        """Get the results of an action by ID.
++
++        :param str action_uuid: Id of the action
++        :param int wait: Time in seconds to wait for action to complete
++
++        """
++        raise NotImplementedError()
++
++    def get_action_status(self, uuid_or_prefix=None, name=None):
++        """Get the status of all actions, filtered by ID, ID prefix, or action name.
++
++        :param str uuid_or_prefix: Filter by action uuid or prefix
++        :param str name: Filter by action name
++
++        """
++        raise NotImplementedError()
++
++    def get_budget(self, budget_name):
++        """Get budget usage info.
++
++        :param str budget_name: Name of budget
++
++        """
++        raise NotImplementedError()
++
++    async def get_status(self, filters=None, utc=False):
++        """Return the status of the model.
++
++        :param str filters: Optional list of applications, units, or machines
++            to include, which can use wildcards ('*').
++        :param bool utc: Display time as UTC in RFC3339 format
++
++        """
++        client_facade = client.ClientFacade.from_connection(self.connection)
++        return await client_facade.FullStatus(filters)
++
++    def sync_tools(
++            self, all_=False, destination=None, dry_run=False, public=False,
++            source=None, stream=None, version=None):
++        """Copy Juju tools into this model.
++
++        :param bool all_: Copy all versions, not just the latest
++        :param str destination: Path to local destination directory
++        :param bool dry_run: Don't do the actual copy
++        :param bool public: Tools are for a public cloud, so generate mirrors
++            information
++        :param str source: Path to local source directory
++        :param str stream: Simplestreams stream for which to sync metadata
++        :param str version: Copy a specific major.minor version
++
++        """
++        raise NotImplementedError()
++
++    def unblock(self, *commands):
++        """Unblock an operation that would alter this model.
++
++        :param str \*commands: The commands to unblock. Valid values are
++            'all-changes', 'destroy-model', 'remove-object'
++
++        """
++        raise NotImplementedError()
++
++    def unset_config(self, *keys):
++        """Unset configuration on this model.
++
++        :param str \*keys: The keys to unset
++
++        """
++        raise NotImplementedError()
++
++    def upgrade_gui(self):
++        """Upgrade the Juju GUI for this model.
++
++        """
++        raise NotImplementedError()
++
++    def upgrade_juju(
++            self, dry_run=False, reset_previous_upgrade=False,
++            upload_tools=False, version=None):
++        """Upgrade Juju on all machines in a model.
++
++        :param bool dry_run: Don't do the actual upgrade
++        :param bool reset_previous_upgrade: Clear the previous (incomplete)
++            upgrade status
++        :param bool upload_tools: Upload local version of tools
++        :param str version: Upgrade to a specific version
++
++        """
++        raise NotImplementedError()
++
++    def upload_backup(self, archive_path):
++        """Store a backup archive remotely in Juju.
++
++        :param str archive_path: Path to local archive
++
++        """
++        raise NotImplementedError()
++
++    @property
++    def charmstore(self):
++        return self._charmstore
++
++    async def get_metrics(self, *tags):
++        """Retrieve metrics.
++
++        :param str \*tags: Tags of entities from which to retrieve metrics.
++            No tags retrieves the metrics of all units in the model.
++        :return: Dictionary of unit_name:metrics
++
++        """
++        log.debug("Retrieving metrics for %s",
++                  ', '.join(tags) if tags else "all units")
++
++        metrics_facade = client.MetricsDebugFacade.from_connection(
++            self.connection)
++
++        entities = [client.Entity(tag) for tag in tags]
++        metrics_result = await metrics_facade.GetMetrics(entities)
++
++        metrics = collections.defaultdict(list)
++
++        for entity_metrics in metrics_result.results:
++            error = entity_metrics.error
++            if error:
++                if "is not a valid tag" in error:
++                    raise ValueError(error.message)
++                else:
++                    raise Exception(error.message)
++
++            for metric in entity_metrics.metrics:
++                metrics[metric.unit].append(vars(metric))
++
++        return metrics
++
++
++def get_charm_series(path):
++    """Inspects the charm directory at ``path`` and returns a default
++    series from its metadata.yaml (the first item in the 'series' list).
++
++    Returns None if no series can be determined.
++
++    """
++    md = Path(path) / "metadata.yaml"
++    if not md.exists():
++        return None
++    data = yaml.load(md.open())
++    series = data.get('series')
++    return series[0] if series else None
++
++
++class BundleHandler(object):
++    """
++    Handle bundles by using the API to translate bundle YAML into a plan of
++    steps and then dispatching each of those using the API.
++    """
++    def __init__(self, model):
++        self.model = model
++        self.charmstore = model.charmstore
++        self.plan = []
++        self.references = {}
++        self._units_by_app = {}
++        for unit_name, unit in model.units.items():
++            app_units = self._units_by_app.setdefault(unit.application, [])
++            app_units.append(unit_name)
++        self.client_facade = client.ClientFacade.from_connection(
++            model.connection)
++        self.app_facade = client.ApplicationFacade.from_connection(
++            model.connection)
++        self.ann_facade = client.AnnotationsFacade.from_connection(
++            model.connection)
++
++    async def _handle_local_charms(self, bundle):
++        """Search for references to local charms (i.e. filesystem paths)
++        in the bundle. Upload the local charms to the model, and replace
++        the filesystem paths with appropriate 'local:' paths in the bundle.
++
++        Return the modified bundle.
++
++        :param dict bundle: Bundle dictionary
++        :return: Modified bundle dictionary
++
++        """
++        apps, args = [], []
++
++        default_series = bundle.get('series')
++        for app_name in self.applications:
++            app_dict = bundle['services'][app_name]
++            charm_dir = os.path.abspath(os.path.expanduser(app_dict['charm']))
++            if not os.path.isdir(charm_dir):
++                continue
++            series = (
++                app_dict.get('series') or
++                default_series or
++                get_charm_series(charm_dir)
++            )
++            if not series:
++                raise JujuError(
++                    "Couldn't determine series for charm at {}. "
++                    "Add a 'series' key to the bundle.".format(charm_dir))
++
++            # Keep track of what we need to update. We keep a list of apps
++            # that need to be updated, and a corresponding list of args
++            # needed to update those apps.
++            apps.append(app_name)
++            args.append((charm_dir, series))
++
++        if apps:
++            # If we have apps to update, spawn all the coroutines concurrently
++            # and wait for them to finish.
++            charm_urls = await asyncio.gather(*[
++                self.model.add_local_charm_dir(*params)
++                for params in args
++            ], loop=self.model.loop)
++            # Update the 'charm:' entry for each app with the new 'local:' url.
++            for app_name, charm_url in zip(apps, charm_urls):
++                bundle['services'][app_name]['charm'] = charm_url
++
++        return bundle
++
++    async def fetch_plan(self, entity_id):
++        is_local = not entity_id.startswith('cs:') and os.path.isdir(entity_id)
++        if is_local:
++            bundle_yaml = (Path(entity_id) / "bundle.yaml").read_text()
++        else:
++            bundle_yaml = await self.charmstore.files(entity_id,
++                                                      filename='bundle.yaml',
++                                                      read_file=True)
++        self.bundle = yaml.safe_load(bundle_yaml)
++        self.bundle = await self._handle_local_charms(self.bundle)
++
++        self.plan = await self.client_facade.GetBundleChanges(
++            yaml.dump(self.bundle))
++
++    async def execute_plan(self):
++        for step in self.plan.changes:
++            method = getattr(self, step.method)
++            result = await method(*step.args)
++            self.references[step.id_] = result
++
++    @property
++    def applications(self):
++        return list(self.bundle['services'].keys())
++
++    def resolve(self, reference):
++        if reference and reference.startswith('$'):
++            reference = self.references[reference[1:]]
++        return reference
++
++    async def addCharm(self, charm, series):
++        """
++        :param charm string:
++            Charm holds the URL of the charm to be added.
++
++        :param series string:
++            Series holds the series of the charm to be added
++            if the charm default is not sufficient.
++        """
++        # We don't add local charms because they've already been added
++        # by self._handle_local_charms
++        if charm.startswith('local:'):
++            return charm
++
++        entity_id = await self.charmstore.entityId(charm)
++        log.debug('Adding %s', entity_id)
++        await self.client_facade.AddCharm(None, entity_id)
++        return entity_id
++
++    async def addMachines(self, params=None):
++        """
++        :param params dict:
++            Dictionary specifying the machine to add. All keys are optional.
++            Keys include:
++
++            series: string specifying the machine OS series.
++
++            constraints: string holding machine constraints, if any. We'll
++                parse this into the json friendly dict that the juju api
++                expects.
++
++            container_type: string holding the type of the container (for
++                instance ""lxd" or kvm"). It is not specified for top level
++                machines.
++
++            parent_id: string holding a placeholder pointing to another
++                machine change or to a unit change. This value is only
++                specified in the case this machine is a container, in
++                which case also ContainerType is set.
++
++        """
++        params = params or {}
++
++        # Normalize keys
++        params = {normalize_key(k): params[k] for k in params.keys()}
++
++        # Fix up values, as necessary.
++        if 'parent_id' in params:
++            params['parent_id'] = self.resolve(params['parent_id'])
++
++        params['constraints'] = parse_constraints(
++            params.get('constraints'))
++        params['jobs'] = params.get('jobs', ['JobHostUnits'])
++
++        if params.get('container_type') == 'lxc':
++            log.warning('Juju 2.0 does not support lxc containers. '
++                        'Converting containers to lxd.')
++            params['container_type'] = 'lxd'
++
++        # Submit the request.
++        params = client.AddMachineParams(**params)
++        results = await self.client_facade.AddMachines([params])
++        error = results.machines[0].error
++        if error:
++            raise ValueError("Error adding machine: %s" % error.message)
++        machine = results.machines[0].machine
++        log.debug('Added new machine %s', machine)
++        return machine
++
++    async def addRelation(self, endpoint1, endpoint2):
++        """
++        :param endpoint1 string:
++        :param endpoint2 string:
++            Endpoint1 and Endpoint2 hold relation endpoints in the
++            "application:interface" form, where the application is always a
++            placeholder pointing to an application change, and the interface is
++            optional. Examples are "$deploy-42:web" or just "$deploy-42".
++        """
++        endpoints = [endpoint1, endpoint2]
++        # resolve indirect references
++        for i in range(len(endpoints)):
++            parts = endpoints[i].split(':')
++            parts[0] = self.resolve(parts[0])
++            endpoints[i] = ':'.join(parts)
++
++        log.info('Relating %s <-> %s', *endpoints)
++        return await self.model.add_relation(*endpoints)
++
++    async def deploy(self, charm, series, application, options, constraints,
++                     storage, endpoint_bindings, resources):
++        """
++        :param charm string:
++            Charm holds the URL of the charm to be used to deploy this
++            application.
++
++        :param series string:
++            Series holds the series of the application to be deployed
++            if the charm default is not sufficient.
++
++        :param application string:
++            Application holds the application name.
++
++        :param options map[string]interface{}:
++            Options holds application options.
++
++        :param constraints string:
++            Constraints holds the optional application constraints.
++
++        :param storage map[string]string:
++            Storage holds the optional storage constraints.
++
++        :param endpoint_bindings map[string]string:
++            EndpointBindings holds the optional endpoint bindings
++
++        :param resources map[string]int:
++            Resources identifies the revision to use for each resource
++            of the application's charm.
++        """
++        # resolve indirect references
++        charm = self.resolve(charm)
++        # the bundle plan doesn't actually do anything with resources, even
++        # though it ostensibly gives us something (None) for that param
++        if not charm.startswith('local:'):
++            resources = await self.model._add_store_resources(application,
++                                                              charm)
++        await self.model._deploy(
++            charm_url=charm,
++            application=application,
++            series=series,
++            config=options,
++            constraints=constraints,
++            endpoint_bindings=endpoint_bindings,
++            resources=resources,
++            storage=storage,
++        )
++        return application
++
++    async def addUnit(self, application, to):
++        """
++        :param application string:
++            Application holds the application placeholder name for which a unit
++            is added.
++
++        :param to string:
++            To holds the optional location where to add the unit, as a
++            placeholder pointing to another unit change or to a machine change.
++        """
++        application = self.resolve(application)
++        placement = self.resolve(to)
++        if self._units_by_app.get(application):
++            # enough units for this application already exist;
++            # claim one, and carry on
++            # NB: this should probably honor placement, but the juju client
++            # doesn't, so we're not bothering, either
++            unit_name = self._units_by_app[application].pop()
++            log.debug('Reusing unit %s for %s', unit_name, application)
++            return self.model.units[unit_name]
++
++        log.debug('Adding new unit for %s%s', application,
++                  ' to %s' % placement if placement else '')
++        return await self.model.applications[application].add_unit(
++            count=1,
++            to=placement,
++        )
++
++    async def expose(self, application):
++        """
++        :param application string:
++            Application holds the placeholder name of the application that must
++            be exposed.
++        """
++        application = self.resolve(application)
++        log.info('Exposing %s', application)
++        return await self.model.applications[application].expose()
++
++    async def setAnnotations(self, id_, entity_type, annotations):
++        """
++        :param id_ string:
++            Id is the placeholder for the application or machine change
++            corresponding to the entity to be annotated.
++
++        :param entity_type EntityType:
++            EntityType holds the type of the entity, "application" or
++            "machine".
++
++        :param annotations map[string]string:
++            Annotations holds the annotations as key/value pairs.
++        """
++        entity_id = self.resolve(id_)
++        try:
++            entity = self.model.state.get_entity(entity_type, entity_id)
++        except KeyError:
++            entity = await self.model._wait_for_new(entity_type, entity_id)
++        return await entity.set_annotations(annotations)
++
++
++class CharmStore(object):
++    """
++    Async wrapper around theblues.charmstore.CharmStore
++    """
++    def __init__(self, loop):
++        self.loop = loop
++        self._cs = theblues.charmstore.CharmStore(timeout=5)
++
++    def __getattr__(self, name):
++        """
++        Wrap method calls in coroutines that use run_in_executor to make them
++        async.
++        """
++        attr = getattr(self._cs, name)
++        if not callable(attr):
++            wrapper = partial(getattr, self._cs, name)
++            setattr(self, name, wrapper)
++        else:
++            async def coro(*args, **kwargs):
++                method = partial(attr, *args, **kwargs)
++                for attempt in range(1, 4):
++                    try:
++                        return await self.loop.run_in_executor(None, method)
++                    except theblues.errors.ServerError:
++                        if attempt == 3:
++                            raise
++                        await asyncio.sleep(1, loop=self.loop)
++            setattr(self, name, coro)
++            wrapper = coro
++        return wrapper
++
++
++class CharmArchiveGenerator(object):
++    """
++    Create a Zip archive of a local charm directory for upload to a controller.
++
++    This is used automatically by
++    `Model.add_local_charm_dir <#juju.model.Model.add_local_charm_dir>`_.
++    """
++    def __init__(self, path):
++        self.path = os.path.abspath(os.path.expanduser(path))
++
++    def make_archive(self, path):
++        """Create archive of directory and write to ``path``.
++
++        :param path: Path to archive
++
++        Ignored::
++
++            * build/\* - This is used for packing the charm itself and any
++                          similar tasks.
++            * \*/.\*    - Hidden files are all ignored for now.  This will most
++                          likely be changed into a specific ignore list
++                          (.bzr, etc)
++
++        """
++        zf = zipfile.ZipFile(path, 'w', zipfile.ZIP_DEFLATED)
++        for dirpath, dirnames, filenames in os.walk(self.path):
++            relative_path = dirpath[len(self.path) + 1:]
++            if relative_path and not self._ignore(relative_path):
++                zf.write(dirpath, relative_path)
++            for name in filenames:
++                archive_name = os.path.join(relative_path, name)
++                if not self._ignore(archive_name):
++                    real_path = os.path.join(dirpath, name)
++                    self._check_type(real_path)
++                    if os.path.islink(real_path):
++                        self._check_link(real_path)
++                        self._write_symlink(
++                            zf, os.readlink(real_path), archive_name)
++                    else:
++                        zf.write(real_path, archive_name)
++        zf.close()
++        return path
++
++    def _check_type(self, path):
++        """Check the path
++        """
++        s = os.stat(path)
++        if stat.S_ISDIR(s.st_mode) or stat.S_ISREG(s.st_mode):
++            return path
++        raise ValueError("Invalid Charm at % %s" % (
++            path, "Invalid file type for a charm"))
++
++    def _check_link(self, path):
++        link_path = os.readlink(path)
++        if link_path[0] == "/":
++            raise ValueError(
++                "Invalid Charm at %s: %s" % (
++                    path, "Absolute links are invalid"))
++        path_dir = os.path.dirname(path)
++        link_path = os.path.join(path_dir, link_path)
++        if not link_path.startswith(os.path.abspath(self.path)):
++            raise ValueError(
++                "Invalid charm at %s %s" % (
++                    path, "Only internal symlinks are allowed"))
++
++    def _write_symlink(self, zf, link_target, link_path):
++        """Package symlinks with appropriate zipfile metadata."""
++        info = zipfile.ZipInfo()
++        info.filename = link_path
++        info.create_system = 3
++        # Magic code for symlinks / py2/3 compat
++        # 27166663808 = (stat.S_IFLNK | 0755) << 16
++        info.external_attr = 2716663808
++        zf.writestr(info, link_target)
++
++    def _ignore(self, path):
++        if path == "build" or path.startswith("build/"):
++            return True
++        if path.startswith('.'):
++            return True
index 0000000,0000000..d0d42f7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,58 @@@
++#
++# This module allows us to parse a machine placement directive into a
++# Placement object suitable for passing through the websocket API.
++#
++# Once https://bugs.launchpad.net/juju/+bug/1645480 is addressed, this
++# module should be deprecated.
++#
++
++from .client import client
++
++MACHINE_SCOPE = "#"
++
++
++def parse(directive):
++    """
++    Given a string in the format `scope:directive`, or simply `scope`
++    or `directive`, return a Placement object suitable for passing
++    back over the websocket API.
++
++    """
++    if not directive:
++        # Handle null case
++        return None
++
++    if isinstance(directive, (list, tuple)):
++        results = []
++        for d in directive:
++            results.extend(parse(d))
++        return results
++
++    if isinstance(directive, (dict, client.Placement)):
++        # We've been handed something that we can simply hand back to
++        # the api. (Forwards compatibility)
++        return [directive]
++
++    # Juju 2.0 can't handle lxc containers.
++    directive = directive.replace('lxc', 'lxd')
++
++    if ":" in directive:
++        # Planner has given us a scope and directive in string form
++        scope, directive = directive.split(":")
++        return [client.Placement(scope=scope, directive=directive)]
++
++    if directive.isdigit():
++        # Planner has given us a machine id (we rely on juju core to
++        # verify its validity.)
++        return [client.Placement(scope=MACHINE_SCOPE, directive=directive)]
++
++    if "/" in directive:
++        # e.g. "0/lxd/0"
++        # https://github.com/juju/juju/blob/master/instance/placement_test.go#L29
++        return [
++            client.Placement(scope=MACHINE_SCOPE, directive=directive),
++        ]
++
++    # Planner has probably given us a container type. Leave it up to
++    # juju core to verify that it is valid.
++    return [client.Placement(scope=directive)]
index 0000000,0000000..ef8946a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,11 @@@
++import logging
++
++from . import model
++
++log = logging.getLogger(__name__)
++
++
++class Relation(model.ModelEntity):
++    async def destroy(self):
++        raise NotImplementedError()
++        # TODO: destroy a relation
index 0000000,0000000..2514229
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++def _prefix(prefix, s):
++    if s and not s.startswith(prefix):
++        return '{}{}'.format(prefix, s)
++    return s
++
++
++def untag(prefix, s):
++    if s and s.startswith(prefix):
++        return s[len(prefix):]
++    return s
++
++
++def cloud(cloud_name):
++    return _prefix('cloud-', cloud_name)
++
++
++def credential(cloud, user, credential_name):
++    credential_string = '{}_{}_{}'.format(cloud, user, credential_name)
++    return _prefix('cloudcred-', credential_string)
++
++
++def model(cloud_name):
++    return _prefix('model-', cloud_name)
++
++
++def user(username):
++    return _prefix('user-', username)
++
++
++def application(app_name):
++    return _prefix('application-', app_name)
index 0000000,0000000..fc597bf
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,274 @@@
++import logging
++
++from dateutil.parser import parse as parse_date
++
++from . import model
++from .client import client
++
++log = logging.getLogger(__name__)
++
++
++class Unit(model.ModelEntity):
++    @property
++    def agent_status(self):
++        """Returns the current agent status string.
++
++        """
++        return self.safe_data['agent-status']['current']
++
++    @property
++    def agent_status_since(self):
++        """Get the time when the `agent_status` was last updated.
++
++        """
++        return parse_date(self.safe_data['agent-status']['since'])
++
++    @property
++    def agent_status_message(self):
++        """Get the agent status message.
++
++        """
++        return self.safe_data['agent-status']['message']
++
++    @property
++    def workload_status(self):
++        """Returns the current workload status string.
++
++        """
++        return self.safe_data['workload-status']['current']
++
++    @property
++    def workload_status_since(self):
++        """Get the time when the `workload_status` was last updated.
++
++        """
++        return parse_date(self.safe_data['workload-status']['since'])
++
++    @property
++    def workload_status_message(self):
++        """Get the workload status message.
++
++        """
++        return self.safe_data['workload-status']['message']
++
++    @property
++    def machine(self):
++        """Get the machine object for this unit.
++
++        """
++        machine_id = self.safe_data['machine-id']
++        if machine_id:
++            return self.model.machines.get(machine_id, None)
++        else:
++            return None
++
++    @property
++    def public_address(self):
++        """ Get the public address.
++
++        """
++        return self.safe_data['public-address'] or None
++
++    @property
++    def tag(self):
++        return 'unit-%s' % self.name.replace('/', '-')
++
++    def add_storage(self, name, constraints=None):
++        """Add unit storage dynamically.
++
++        :param str name: Storage name, as specified by the charm
++        :param str constraints: Comma-separated list of constraints in the
++            form 'POOL,COUNT,SIZE'
++
++        """
++        raise NotImplementedError()
++
++    def collect_metrics(self):
++        """Collect metrics on this unit.
++
++        """
++        raise NotImplementedError()
++
++    async def destroy(self):
++        """Destroy this unit.
++
++        """
++        app_facade = client.ApplicationFacade.from_connection(self.connection)
++
++        log.debug(
++            'Destroying %s', self.name)
++
++        return await app_facade.DestroyUnits([self.name])
++    remove = destroy
++
++    def get_resources(self, details=False):
++        """Return resources for this unit.
++
++        :param bool details: Include detailed info about resources used by each
++            unit
++
++        """
++        raise NotImplementedError()
++
++    def resolved(self, retry=False):
++        """Mark unit errors resolved.
++
++        :param bool retry: Re-execute failed hooks
++
++        """
++        raise NotImplementedError()
++
++    async def run(self, command, timeout=None):
++        """Run command on this unit.
++
++        :param str command: The command to run
++        :param int timeout: Time to wait before command is considered failed
++        :returns: A :class:`juju.action.Action` instance.
++
++        """
++        action = client.ActionFacade.from_connection(self.connection)
++
++        log.debug(
++            'Running `%s` on %s', command, self.name)
++
++        res = await action.Run(
++            [],
++            command,
++            [],
++            timeout,
++            [self.name],
++        )
++        return await self.model.wait_for_action(res.results[0].action.tag)
++
++    async def run_action(self, action_name, **params):
++        """Run an action on this unit.
++
++        :param str action_name: Name of action to run
++        :param \*\*params: Action parameters
++        :returns: A :class:`juju.action.Action` instance.
++
++        Note that this only enqueues the action.  You will need to call
++        ``action.wait()`` on the resulting `Action` instance if you wish
++        to block until the action is complete.
++
++        """
++        action_facade = client.ActionFacade.from_connection(self.connection)
++
++        log.debug('Starting action `%s` on %s', action_name, self.name)
++
++        res = await action_facade.Enqueue([client.Action(
++            name=action_name,
++            parameters=params,
++            receiver=self.tag,
++        )])
++        action = res.results[0].action
++        error = res.results[0].error
++        if error and error.code == 'not found':
++            raise ValueError('Action `%s` not found on %s' % (action_name,
++                                                              self.name))
++        elif error:
++            raise Exception('Unknown action error: %s' % error.serialize())
++        action_id = action.tag[len('action-'):]
++        log.debug('Action started as %s', action_id)
++        # we mustn't use wait_for_action because that blocks until the
++        # action is complete, rather than just being in the model
++        return await self.model._wait_for_new('action', action_id)
++
++    async def scp_to(self, source, destination, user='ubuntu', proxy=False,
++                     scp_opts=''):
++        """Transfer files to this unit.
++
++        :param str source: Local path of file(s) to transfer
++        :param str destination: Remote destination of transferred files
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str scp_opts: Additional options to the `scp` command
++        """
++        await self.machine.scp_to(source, destination, user=user, proxy=proxy,
++                                  scp_opts=scp_opts)
++
++    async def scp_from(self, source, destination, user='ubuntu', proxy=False,
++                       scp_opts=''):
++        """Transfer files from this unit.
++
++        :param str source: Remote path of file(s) to transfer
++        :param str destination: Local destination of transferred files
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str scp_opts: Additional options to the `scp` command
++        """
++        await self.machine.scp_from(source, destination, user=user,
++                                    proxy=proxy, scp_opts=scp_opts)
++
++    def set_meter_status(self):
++        """Set the meter status on this unit.
++
++        """
++        raise NotImplementedError()
++
++    def ssh(
++            self, command, user=None, proxy=False, ssh_opts=None):
++        """Execute a command over SSH on this unit.
++
++        :param str command: Command to execute
++        :param str user: Remote username
++        :param bool proxy: Proxy through the Juju API server
++        :param str ssh_opts: Additional options to the `ssh` command
++
++        """
++        raise NotImplementedError()
++
++    def status_history(self, num=20, utc=False):
++        """Get status history for this unit.
++
++        :param int num: Size of history backlog
++        :param bool utc: Display time as UTC in RFC3339 format
++
++        """
++        raise NotImplementedError()
++
++    async def is_leader_from_status(self):
++        """
++        Check to see if this unit is the leader. Returns True if so, and
++        False if it is not, or if leadership does not make sense
++        (e.g., there is no leader in this application.)
++
++        This method is a kluge that calls FullStatus in the
++        ClientFacade to get its information. Once
++        https://bugs.launchpad.net/juju/+bug/1643691 is resolved, we
++        should add a simple .is_leader property, and deprecate this
++        method.
++
++        """
++        app = self.name.split("/")[0]
++
++        c = client.ClientFacade.from_connection(self.connection)
++
++        status = await c.FullStatus(None)
++
++        # FullStatus may be more up to date than our model, and the
++        # unit may have gone away, or we may be doing something silly,
++        # like trying to fetch leadership for a subordinate, which
++        # will not be filed where we expect in the model. In those
++        # cases, we may simply return False, as a nonexistent or
++        # subordinate unit is not a leader.
++        if not status.applications.get(app):
++            return False
++
++        if not status.applications[app].get('units'):
++            return False
++
++        if not status.applications[app]['units'].get(self.name):
++            return False
++
++        return status.applications[app]['units'][self.name].get('leader',
++                                                                False)
++
++    async def get_metrics(self):
++        """Get metrics for the unit.
++
++        :return: Dictionary of metrics for this unit.
++
++        """
++        metrics = await self.model.get_metrics(self.tag)
++        return metrics[self.name]
index 0000000,0000000..1d1b24e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,98 @@@
++import asyncio
++import os
++from collections import defaultdict
++from functools import partial
++from pathlib import Path
++
++
++async def execute_process(*cmd, log=None, loop=None):
++    '''
++    Wrapper around asyncio.create_subprocess_exec.
++
++    '''
++    p = await asyncio.create_subprocess_exec(
++            *cmd,
++            stdin=asyncio.subprocess.PIPE,
++            stdout=asyncio.subprocess.PIPE,
++            stderr=asyncio.subprocess.PIPE,
++            loop=loop)
++    stdout, stderr = await p.communicate()
++    if log:
++        log.debug("Exec %s -> %d", cmd, p.returncode)
++        if stdout:
++            log.debug(stdout.decode('utf-8'))
++        if stderr:
++            log.debug(stderr.decode('utf-8'))
++    return p.returncode == 0
++
++
++def _read_ssh_key():
++    '''
++    Inner function for read_ssh_key, suitable for passing to our
++    Executor.
++
++    '''
++    default_data_dir = Path(Path.home(), ".local", "share", "juju")
++    juju_data = os.environ.get("JUJU_DATA", default_data_dir)
++    ssh_key_path = Path(juju_data, 'ssh', 'juju_id_rsa.pub')
++    with ssh_key_path.open('r') as ssh_key_file:
++        ssh_key = ssh_key_file.readlines()[0].strip()
++    return ssh_key
++
++
++async def read_ssh_key(loop):
++    '''
++    Attempt to read the local juju admin's public ssh key, so that it
++    can be passed on to a model.
++
++    '''
++    return await loop.run_in_executor(None, _read_ssh_key)
++
++
++class IdQueue:
++    """
++    Wrapper around asyncio.Queue that maintains a separate queue for each ID.
++    """
++    def __init__(self, maxsize=0, *, loop=None):
++        self._queues = defaultdict(partial(asyncio.Queue, maxsize, loop=loop))
++
++    async def get(self, id):
++        value = await self._queues[id].get()
++        del self._queues[id]
++        if isinstance(value, Exception):
++            raise value
++        return value
++
++    async def put(self, id, value):
++        await self._queues[id].put(value)
++
++    async def put_all(self, value):
++        for queue in self._queues.values():
++            await queue.put(value)
++
++
++async def run_with_interrupt(task, event, loop=None):
++    """
++    Awaits a task while allowing it to be interrupted by an `asyncio.Event`.
++
++    If the task finishes without the event becoming set, the results of the
++    task will be returned.  If the event becomes set, the task will be
++    cancelled ``None`` will be returned.
++
++    :param task: Task to run
++    :param event: An `asyncio.Event` which, if set, will interrupt `task`
++        and cause it to be cancelled.
++    :param loop: Optional event loop to use other than the default.
++    """
++    loop = loop or asyncio.get_event_loop()
++    event_task = loop.create_task(event.wait())
++    done, pending = await asyncio.wait([task, event_task],
++                                       loop=loop,
++                                       return_when=asyncio.FIRST_COMPLETED)
++    for f in pending:
++        f.cancel()
++    result = [f.result() for f in done if f is not event_task]
++    if result:
++        return result[0]
++    else:
++        return None
index 0000000,0000000..3ef628e
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,39 @@@
++#!/bin/bash
++packages=(
++    juju.action
++    juju.annotation
++    juju.application
++    juju.cloud
++    juju.constraints
++    juju.controller
++    juju.delta
++    juju.errors
++    juju.exceptions
++    juju.juju
++    juju.loop
++    juju.machine
++    juju.model
++    juju.placement
++    juju.relation
++    juju.tag
++    juju.unit
++    juju.utils
++)
++
++for pkg in ${packages[@]}; do
++    cat <<EOD > docs/api/$pkg.rst
++$pkg
++$(echo $pkg | sed -e 's/./=/g')
++
++.. rubric:: Summary
++
++.. automembersummary:: $pkg
++
++.. rubric:: Reference
++
++.. automodule:: $pkg
++    :members:
++    :undoc-members:
++    :show-inheritance:
++EOD
++done
index 0000000,0000000..df12cfe
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,56 @@@
++# Copyright 2016 Canonical Ltd.
++#
++# Licensed under the Apache License, Version 2.0 (the "License");
++# you may not use this file except in compliance with the License.
++# You may obtain a copy of the License at
++#
++#     http://www.apache.org/licenses/LICENSE-2.0
++#
++#     Unless required by applicable law or agreed to in writing, software
++#     distributed under the License is distributed on an "AS IS" BASIS,
++#     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++#     See the License for the specific language governing permissions and
++#     limitations under the License.
++
++from pathlib import Path
++from setuptools import setup, find_packages
++
++here = Path(__file__).absolute().parent
++readme = here / 'docs' / 'readme.rst'
++changelog = here / 'docs' / 'changelog.rst'
++long_description = '{}\n\n{}'.format(
++    readme.read_text(),
++    changelog.read_text()
++)
++version = here / 'VERSION'
++
++setup(
++    name='juju',
++    version=version.read_text().strip(),
++    packages=find_packages(
++        exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
++    install_requires=[
++        'websockets',
++        'pyyaml',
++        'theblues',
++        'python-dateutil'
++    ],
++    include_package_data=True,
++    maintainer='Juju Ecosystem Engineering',
++    maintainer_email='juju@lists.ubuntu.com',
++    description=('Python library for Juju'),
++    long_description=long_description,
++    url='https://github.com/juju/python-libjuju',
++    license='Apache 2',
++    classifiers=[
++        "Development Status :: 3 - Alpha",
++        "Intended Audience :: Developers",
++        "Programming Language :: Python",
++        "Programming Language :: Python :: 3",
++        "Programming Language :: Python :: 3.5",
++    ],
++    entry_points={
++        'console_scripts': [
++        ],
++    },
++)
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..e1ec452
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,67 @@@
++import mock
++import subprocess
++import uuid
++
++import pytest
++
++from juju.controller import Controller
++from juju.client.connection import JujuData
++
++
++def is_bootstrapped():
++    result = subprocess.run(['juju', 'switch'], stdout=subprocess.PIPE)
++    return (
++        result.returncode == 0 and
++        len(result.stdout.decode().strip()) > 0)
++
++bootstrapped = pytest.mark.skipif(
++    not is_bootstrapped(),
++    reason='bootstrapped Juju environment required')
++
++
++class CleanController():
++    def __init__(self):
++        self.controller = None
++
++    async def __aenter__(self):
++        self.controller = Controller()
++        await self.controller.connect_current()
++        return self.controller
++
++    async def __aexit__(self, exc_type, exc, tb):
++        await self.controller.disconnect()
++
++
++class CleanModel():
++    def __init__(self):
++        self.controller = None
++        self.model = None
++
++    async def __aenter__(self):
++        self.controller = Controller()
++        await self.controller.connect_current()
++
++        model_name = 'model-{}'.format(uuid.uuid4())
++        self.model = await self.controller.add_model(model_name)
++
++        # save the model UUID in case test closes model
++        self.model_uuid = self.model.info.uuid
++
++        # Ensure that we connect to the new model by default.  This also
++        # prevents failures if test was started with no current model.
++        self._patch_cm = mock.patch.object(JujuData, 'current_model',
++                                           return_value=model_name)
++        self._patch_cm.start()
++
++        return self.model
++
++    async def __aexit__(self, exc_type, exc, tb):
++        self._patch_cm.stop()
++        await self.model.disconnect()
++        await self.controller.destroy_model(self.model_uuid)
++        await self.controller.disconnect()
++
++
++class AsyncMock(mock.MagicMock):
++    async def __call__(self, *args, **kwargs):
++        return super().__call__(*args, **kwargs)
index 0000000,0000000..19a45ec
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++series: xenial
++services:
++  wordpress:
++    charm: "cs:trusty/wordpress-2"
++    num_units: 1
++    annotations:
++      "gui-x": "339.5"
++      "gui-y": "-171"
++    to:
++      - "0"
++  mysql:
++    charm: "cs:trusty/mysql-26"
++    num_units: 1
++    annotations:
++      "gui-x": "79.5"
++      "gui-y": "-142"
++    to:
++      - "1"
++relations:
++  - - "wordpress:db"
++    - "mysql:db"
++machines:
++  "0":
++    series: trusty
++    constraints: "arch=amd64 cores=1 cpu-power=100 mem=1740 root-disk=8192"
++  "1":
++    series: trusty
++    constraints: "arch=amd64 cores=1 cpu-power=100 mem=1740 root-disk=8192"
index 0000000,0000000..74eab3d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++name: charm
++series: ["xenial"]
++summary: "test"
++description: "test"
++maintainers: ["test"]
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..d0245c5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++series: xenial
++services:
++  ghost:
++    charm: "cs:ghost-19"
++    num_units: 1
++  mysql:
++    charm: "cs:trusty/mysql-57"
++    num_units: 1
++  test:
++    charm: "./tests/integration/charm"
++relations:
++  - ["ghost", "mysql"]
index 0000000,0000000..74eab3d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++name: charm
++series: ["xenial"]
++summary: "test"
++description: "test"
++maintainers: ["test"]
index 0000000,0000000..1a4fcaa
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,94 @@@
++import pytest
++
++from .. import base
++
++MB = 1
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_action(event_loop):
++    async with base.CleanModel() as model:
++        ubuntu_app = await model.deploy(
++            'mysql',
++            application_name='mysql',
++            series='trusty',
++            channel='stable',
++            config={
++                'tuning-level': 'safest',
++            },
++            constraints={
++                'mem': 256 * MB,
++            },
++        )
++
++        # update and check app config
++        await ubuntu_app.set_config({'tuning-level': 'fast'})
++        config = await ubuntu_app.get_config()
++        assert config['tuning-level']['value'] == 'fast'
++
++        # update and check app constraints
++        await ubuntu_app.set_constraints({'mem': 512 * MB})
++        constraints = await ubuntu_app.get_constraints()
++        assert constraints['mem'] == 512 * MB
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_add_units(event_loop):
++    from juju.unit import Unit
++
++    async with base.CleanModel() as model:
++        app = await model.deploy(
++            'ubuntu-0',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++        units = await app.add_units(count=2)
++
++        assert len(units) == 2
++        for unit in units:
++            assert isinstance(unit, Unit)
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_upgrade_charm(event_loop):
++    async with base.CleanModel() as model:
++        app = await model.deploy('ubuntu-0')
++        assert app.data['charm-url'] == 'cs:ubuntu-0'
++        await app.upgrade_charm()
++        assert app.data['charm-url'].startswith('cs:ubuntu-')
++        assert app.data['charm-url'] != 'cs:ubuntu-0'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_upgrade_charm_channel(event_loop):
++    async with base.CleanModel() as model:
++        app = await model.deploy('ubuntu-0')
++        assert app.data['charm-url'] == 'cs:ubuntu-0'
++        await app.upgrade_charm(channel='stable')
++        assert app.data['charm-url'].startswith('cs:ubuntu-')
++        assert app.data['charm-url'] != 'cs:ubuntu-0'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_upgrade_charm_revision(event_loop):
++    async with base.CleanModel() as model:
++        app = await model.deploy('ubuntu-0')
++        assert app.data['charm-url'] == 'cs:ubuntu-0'
++        await app.upgrade_charm(revision=8)
++        assert app.data['charm-url'] == 'cs:ubuntu-8'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_upgrade_charm_switch(event_loop):
++    async with base.CleanModel() as model:
++        app = await model.deploy('ubuntu-0')
++        assert app.data['charm-url'] == 'cs:ubuntu-0'
++        await app.upgrade_charm(switch='ubuntu-8')
++        assert app.data['charm-url'] == 'cs:ubuntu-8'
index 0000000,0000000..e4c9c92
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,21 @@@
++import pytest
++
++from juju.client import client
++
++from .. import base
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_user_info(event_loop):
++    async with base.CleanModel() as model:
++        controller_conn = await model.connection.controller()
++
++        um = client.UserManagerFacade.from_connection(controller_conn)
++        result = await um.UserInfo(
++            [client.Entity('user-admin')], True)
++        await controller_conn.close()
++
++        assert isinstance(result, client.UserInfoResults)
++        for r in result.results:
++            assert isinstance(r, client.UserInfoResult)
index 0000000,0000000..290203d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,83 @@@
++import asyncio
++import pytest
++
++from juju.client.connection import Connection
++from juju.client import client
++from .. import base
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_connect_current(event_loop):
++    async with base.CleanModel():
++        conn = await Connection.connect_current()
++
++        assert isinstance(conn, Connection)
++        await conn.close()
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_monitor(event_loop):
++
++    async with base.CleanModel():
++        conn = await Connection.connect_current()
++
++        assert conn.monitor.status == 'connected'
++        await conn.close()
++
++        assert conn.monitor.status == 'disconnected'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_monitor_catches_error(event_loop):
++
++    async with base.CleanModel():
++        conn = await Connection.connect_current()
++
++        assert conn.monitor.status == 'connected'
++        await conn.ws.close()
++
++        assert conn.monitor.status == 'error'
++
++        await conn.close()
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_full_status(event_loop):
++    async with base.CleanModel() as model:
++        await model.deploy(
++            'ubuntu-0',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++
++        c = client.ClientFacade.from_connection(model.connection)
++
++        await c.FullStatus(None)
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_reconnect(event_loop):
++    async with base.CleanModel() as model:
++        conn = await Connection.connect(
++            model.connection.endpoint,
++            model.connection.uuid,
++            model.connection.username,
++            model.connection.password,
++            model.connection.cacert,
++            model.connection.macaroons,
++            model.connection.loop,
++            model.connection.max_frame_size)
++        try:
++            await asyncio.sleep(0.1)
++            assert conn.is_open
++            await conn.ws.close()
++            assert not conn.is_open
++            await model.block_until(lambda: conn.is_open, timeout=3)
++        finally:
++            await conn.close()
index 0000000,0000000..f3840cc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,77 @@@
++import pytest
++import uuid
++
++from .. import base
++from juju.controller import Controller
++from juju.errors import JujuAPIError
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_add_user(event_loop):
++    async with base.CleanController() as controller:
++        username = 'test{}'.format(uuid.uuid4())
++        await controller.add_user(username)
++        result = await controller.get_user(username)
++        res_ser = result.serialize()['results'][0].serialize()
++        assert res_ser['result'] is not None
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_disable_enable_user(event_loop):
++    async with base.CleanController() as controller:
++        username = 'test-disable{}'.format(uuid.uuid4())
++        await controller.add_user(username)
++        await controller.disable_user(username)
++        result = await controller.get_user(username)
++        res_ser = result.serialize()['results'][0].serialize()
++        assert res_ser['result'].serialize()['disabled'] is True
++        await controller.enable_user(username)
++        result = await controller.get_user(username)
++        res_ser = result.serialize()['results'][0].serialize()
++        assert res_ser['result'].serialize()['disabled'] is False
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_change_user_password(event_loop):
++    async with base.CleanController() as controller:
++        username = 'test-password{}'.format(uuid.uuid4())
++        await controller.add_user(username)
++        await controller.change_user_password(username, 'password')
++        try:
++            new_controller = Controller()
++            await new_controller.connect(
++                controller.connection.endpoint, username, 'password')
++            result = True
++            await new_controller.disconnect()
++        except JujuAPIError:
++            result = False
++        assert result is True
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_grant(event_loop):
++    async with base.CleanController() as controller:
++        username = 'test-grant{}'.format(uuid.uuid4())
++        await controller.add_user(username)
++        await controller.grant(username, 'superuser')
++        result = await controller.get_user(username)
++        result = result.serialize()['results'][0].serialize()['result']\
++            .serialize()
++        assert result['access'] == 'superuser'
++        await controller.grant(username, 'login')
++        result = await controller.get_user(username)
++        result = result.serialize()['results'][0].serialize()['result']\
++            .serialize()
++        assert result['access'] == 'login'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_get_models(event_loop):
++    async with base.CleanController() as controller:
++        result = await controller.get_models()
++        assert isinstance(result.serialize()['user-models'], list)
index 0000000,0000000..06b3826
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,68 @@@
++import pytest
++
++from .. import base
++
++MB = 1
++GB = 1024
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_juju_api_error(event_loop):
++    '''
++    Verify that we raise a JujuAPIError for responses with an error in
++    a top level key (for completely invalid requests).
++
++    '''
++    from juju.errors import JujuAPIError
++
++    async with base.CleanModel() as model:
++        with pytest.raises(JujuAPIError):
++            await model.add_machine(constraints={'mem': 'foo'})
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_juju_error_in_results_list(event_loop):
++    '''
++    Replicate the code that caused
++    https://github.com/juju/python-libjuju/issues/67, and verify that
++    we get a JujuError instead of passing silently by the failure.
++
++    (We don't raise a JujuAPIError, because the request isn't
++    completely invalid -- it's just passing a tag that doesn't exist.)
++
++    This also verifies that we will raise a JujuError any time there
++    is an error in one of a list of results.
++
++    '''
++    from juju.errors import JujuError
++    from juju.client import client
++
++    async with base.CleanModel() as model:
++        ann_facade = client.AnnotationsFacade.from_connection(model.connection)
++
++        ann = client.EntityAnnotations(
++            entity='badtag',
++            annotations={'gui-x': '1', 'gui-y': '1'},
++        )
++        with pytest.raises(JujuError):
++            return await ann_facade.Set([ann])
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_juju_error_in_result(event_loop):
++    '''
++    Verify that we raise a JujuError when appropraite when we are
++    looking at a single result coming back.
++
++    '''
++    from juju.errors import JujuError    
++    from juju.client import client
++
++    async with base.CleanModel() as model:
++        app_facade = client.ApplicationFacade.from_connection(model.connection)
++
++        with pytest.raises(JujuError):
++            return await app_facade.GetCharmURL('foo')
index 0000000,0000000..60de035
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,62 @@@
++import asyncio
++import pytest
++
++from tempfile import NamedTemporaryFile
++
++from .. import base
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_status(event_loop):
++    async with base.CleanModel() as model:
++        await model.deploy(
++            'ubuntu-0',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++
++        await asyncio.wait_for(
++            model.block_until(lambda: len(model.machines)),
++            timeout=240)
++        machine = model.machines['0']
++
++        assert machine.status in ('allocating', 'pending')
++        assert machine.agent_status == 'pending'
++        assert not machine.agent_version
++
++        await asyncio.wait_for(
++            model.block_until(lambda: (machine.status == 'running' and
++                                       machine.agent_status == 'started')),
++            timeout=480)
++
++        assert machine.status == 'running'
++        # there is some inconsistency in the message case between providers
++        assert machine.status_message.lower() == 'running'
++        assert machine.agent_status == 'started'
++        assert machine.agent_version.major >= 2
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_scp(event_loop):
++    async with base.CleanModel() as model:
++        await model.add_machine()
++        await asyncio.wait_for(
++            model.block_until(lambda: model.machines),
++            timeout=240)
++        machine = model.machines['0']
++        await asyncio.wait_for(
++            model.block_until(lambda: (machine.status == 'running' and
++                                       machine.agent_status == 'started')),
++            timeout=480)
++
++        with NamedTemporaryFile() as f:
++            f.write(b'testcontents')
++            f.flush()
++            await machine.scp_to(f.name, 'testfile')
++
++        with NamedTemporaryFile() as f:
++            await machine.scp_from('testfile', f.name)
++            assert f.read() == b'testcontents'
index 0000000,0000000..8506786
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,249 @@@
++import asyncio
++from concurrent.futures import ThreadPoolExecutor
++from pathlib import Path
++import pytest
++
++from .. import base
++from juju.model import Model
++from juju.client.client import ConfigValue
++
++MB = 1
++GB = 1024
++SSH_KEY = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsYMJGNGG74HAJha3n2CFmWYsOOaORnJK6VqNy86pj0MIpvRXBzFzVy09uPQ66GOQhTEoJHEqE77VMui7+62AcMXT+GG7cFHcnU8XVQsGM6UirCcNyWNysfiEMoAdZScJf/GvoY87tMEszhZIUV37z8PUBx6twIqMdr31W1J0IaPa+sV6FEDadeLaNTvancDcHK1zuKsL39jzAg7+LYjKJfEfrsQP+lj/EQcjtKqlhVS5kzsJVfx8ZEd0xhW5G7N6bCdKNalS8mKCMaBXJpijNQ82AiyqCIDCRrre2To0/i7pTjRiL0U9f9mV3S4NJaQaokR050w/ZLySFf6F7joJT mathijs@Qrama-Mathijs'  # noqa
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_deploy_local_bundle(event_loop):
++    from pathlib import Path
++    tests_dir = Path(__file__).absolute().parent.parent
++    bundle_path = tests_dir / 'bundle'
++
++    async with base.CleanModel() as model:
++        await model.deploy(str(bundle_path))
++
++        for app in ('wordpress', 'mysql'):
++            assert app in model.applications
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_deploy_bundle(event_loop):
++    async with base.CleanModel() as model:
++        await model.deploy('bundle/wiki-simple')
++
++        for app in ('wiki', 'mysql'):
++            assert app in model.applications
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_deploy_channels_revs(event_loop):
++    async with base.CleanModel() as model:
++        charm = 'cs:~johnsca/libjuju-test'
++        stable = await model.deploy(charm, 'a1')
++        edge = await model.deploy(charm, 'a2', channel='edge')
++        rev = await model.deploy(charm+'-2', 'a3')
++
++        assert [a.charm_url for a in (stable, edge, rev)] == [
++            'cs:~johnsca/libjuju-test-1',
++            'cs:~johnsca/libjuju-test-2',
++            'cs:~johnsca/libjuju-test-2',
++        ]
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_add_machine(event_loop):
++    from juju.machine import Machine
++
++    async with base.CleanModel() as model:
++        # add a new default machine
++        machine1 = await model.add_machine()
++
++        # add a machine with constraints, disks, and series
++        machine2 = await model.add_machine(
++            constraints={
++                'mem': 256 * MB,
++            },
++            disks=[{
++                'pool': 'rootfs',
++                'size': 10 * GB,
++                'count': 1,
++            }],
++            series='xenial',
++        )
++
++        # add a lxd container to machine2
++        machine3 = await model.add_machine(
++            'lxd:{}'.format(machine2.id))
++
++        for m in (machine1, machine2, machine3):
++            assert isinstance(m, Machine)
++
++        assert len(model.machines) == 3
++
++        await machine3.destroy(force=True)
++        await machine2.destroy(force=True)
++        res = await machine1.destroy(force=True)
++
++        assert res is None
++        assert len(model.machines) == 0
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_relate(event_loop):
++    from juju.relation import Relation
++
++    async with base.CleanModel() as model:
++        await model.deploy(
++            'ubuntu',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++        await model.deploy(
++            'nrpe',
++            application_name='nrpe',
++            series='trusty',
++            channel='stable',
++            # subordinates must be deployed without units
++            num_units=0,
++        )
++        my_relation = await model.add_relation(
++            'ubuntu',
++            'nrpe',
++        )
++
++        assert isinstance(my_relation, Relation)
++
++
++async def _deploy_in_loop(new_loop, model_name):
++    new_model = Model(new_loop)
++    await new_model.connect_model(model_name)
++    try:
++        await new_model.deploy('cs:xenial/ubuntu')
++        assert 'ubuntu' in new_model.applications
++    finally:
++        await new_model.disconnect()
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_explicit_loop(event_loop):
++    async with base.CleanModel() as model:
++        model_name = model.info.name
++        new_loop = asyncio.new_event_loop()
++        new_loop.run_until_complete(
++            _deploy_in_loop(new_loop, model_name))
++        await model._wait_for_new('application', 'ubuntu')
++        assert 'ubuntu' in model.applications
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_explicit_loop_threaded(event_loop):
++    async with base.CleanModel() as model:
++        model_name = model.info.name
++        new_loop = asyncio.new_event_loop()
++        with ThreadPoolExecutor(1) as executor:
++            f = executor.submit(
++                new_loop.run_until_complete,
++                _deploy_in_loop(new_loop, model_name))
++            f.result()
++        await model._wait_for_new('application', 'ubuntu')
++        assert 'ubuntu' in model.applications
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_store_resources_charm(event_loop):
++    async with base.CleanModel() as model:
++        ghost = await model.deploy('cs:ghost-19')
++        assert 'ghost' in model.applications
++        terminal_statuses = ('active', 'error', 'blocked')
++        await model.block_until(
++            lambda: (
++                len(ghost.units) > 0 and
++                ghost.units[0].workload_status in terminal_statuses)
++            )
++        # ghost will go in to blocked (or error, for older
++        # charm revs) if the resource is missing
++        assert ghost.units[0].workload_status == 'active'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_store_resources_bundle(event_loop):
++    async with base.CleanModel() as model:
++        bundle = str(Path(__file__).parent / 'bundle')
++        await model.deploy(bundle)
++        assert 'ghost' in model.applications
++        ghost = model.applications['ghost']
++        terminal_statuses = ('active', 'error', 'blocked')
++        await model.block_until(
++            lambda: (
++                len(ghost.units) > 0 and
++                ghost.units[0].workload_status in terminal_statuses)
++            )
++        # ghost will go in to blocked (or error, for older
++        # charm revs) if the resource is missing
++        assert ghost.units[0].workload_status == 'active'
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_ssh_key(event_loop):
++    async with base.CleanModel() as model:
++        await model.add_ssh_key('admin', SSH_KEY)
++        result = await model.get_ssh_key(True)
++        result = result.serialize()['results'][0].serialize()['result']
++        assert SSH_KEY in result
++        await model.remove_ssh_key('admin', SSH_KEY)
++        result = await model.get_ssh_key(True)
++        result = result.serialize()['results'][0].serialize()['result']
++        assert result is None
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_get_machines(event_loop):
++    async with base.CleanModel() as model:
++        result = await model.get_machines()
++        assert isinstance(result, list)
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_watcher_reconnect(event_loop):
++    async with base.CleanModel() as model:
++        await model.connection.ws.close()
++        await asyncio.sleep(0.1)
++        assert model.connection.is_open
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_config(event_loop):
++    async with base.CleanModel() as model:
++        await model.set_config({
++            'extra-info': 'booyah',
++            'test-mode': ConfigValue(value=True),
++        })
++        result = await model.get_config()
++        assert 'extra-info' in result
++        assert result['extra-info'].source == 'model'
++        assert result['extra-info'].value == 'booyah'
++
++# @base.bootstrapped
++# @pytest.mark.asyncio
++# async def test_grant(event_loop)
++#    async with base.CleanController() as controller:
++#        await controller.add_user('test-model-grant')
++#        await controller.grant('test-model-grant', 'superuser')
++#    async with base.CleanModel() as model:
++#        await model.grant('test-model-grant', 'admin')
++#        assert model.get_user('test-model-grant')['access'] == 'admin'
++#        await model.grant('test-model-grant', 'login')
++#        assert model.get_user('test-model-grant')['access'] == 'login'
index 0000000,0000000..1604c31
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,78 @@@
++import asyncio
++import pytest
++
++from tempfile import NamedTemporaryFile
++
++from .. import base
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_run(event_loop):
++    from juju.action import Action
++
++    async with base.CleanModel() as model:
++        app = await model.deploy(
++            'ubuntu-0',
++            application_name='ubuntu',
++            series='trusty',
++            channel='stable',
++        )
++
++        for unit in app.units:
++            action = await unit.run('unit-get public-address')
++            assert isinstance(action, Action)
++            assert 'Stdout' in action.results
++            break
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_run_action(event_loop):
++    async def run_action(unit):
++        # unit.run() returns a juju.action.Action instance
++        action = await unit.run_action('add-repo', repo='myrepo')
++        # wait for the action to complete
++        return await action.wait()
++
++    async with base.CleanModel() as model:
++        app = await model.deploy(
++            'git',
++            application_name='git',
++            series='trusty',
++            channel='stable',
++        )
++
++        for unit in app.units:
++            action = await run_action(unit)
++            assert action.results == {'dir': '/var/git/myrepo.git'}
++            break
++
++
++@base.bootstrapped
++@pytest.mark.asyncio
++async def test_scp(event_loop):
++    async with base.CleanModel() as model:
++        app = await model.deploy('ubuntu')
++
++        await asyncio.wait_for(
++            model.block_until(lambda: app.units),
++            timeout=60)
++        unit = app.units[0]
++        await asyncio.wait_for(
++            model.block_until(lambda: unit.machine),
++            timeout=60)
++        machine = unit.machine
++        await asyncio.wait_for(
++            model.block_until(lambda: (machine.status == 'running' and
++                                       machine.agent_status == 'started')),
++            timeout=480)
++
++        with NamedTemporaryFile() as f:
++            f.write(b'testcontents')
++            f.flush()
++            await unit.scp_to(f.name, 'testfile')
++
++        with NamedTemporaryFile() as f:
++            await unit.scp_from('testfile', f.name)
++            assert f.read() == b'testcontents'
index 0000000,0000000..e69de29
new file mode 100644 (file)
--- /dev/null
--- /dev/null
index 0000000,0000000..7828cf3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++"""
++Tests for generated client code
++
++"""
++
++import mock
++import pytest
++
++
++from juju.client import client
++
++
++
++def test_basics():
++    assert client.CLIENTS
++    for i in range(1,5):  # Assert versions 1-4 in client dict
++        assert str(i) in client.CLIENTS
++
++
++def test_from_connection():
++    connection = mock.Mock()
++    connection.facades = {"Action": 2}
++    action_facade = client.ActionFacade.from_connection(connection)
++
++    
index 0000000,0000000..f69b8d6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,54 @@@
++import asyncio
++import json
++import mock
++import pytest
++from collections import deque
++
++from websockets.exceptions import ConnectionClosed
++
++from .. import base
++from juju.client.connection import Connection
++
++
++class WebsocketMock:
++    def __init__(self, responses):
++        super().__init__()
++        self.responses = deque(responses)
++        self.open = True
++
++    async def send(self, message):
++        pass
++
++    async def recv(self):
++        if not self.responses:
++            await asyncio.sleep(1)  # delay to give test time to finish
++            raise ConnectionClosed(0, 'ran out of responses')
++        return json.dumps(self.responses.popleft())
++
++    async def close(self):
++        self.open = False
++
++
++@pytest.mark.asyncio
++async def test_out_of_order(event_loop):
++    con = Connection(*[None]*4)
++    ws = WebsocketMock([
++        {'request-id': 1},
++        {'request-id': 3},
++        {'request-id': 2},
++    ])
++    expected_responses = [
++        {'request-id': 1},
++        {'request-id': 2},
++        {'request-id': 3},
++    ]
++    con._get_sll = mock.MagicMock()
++    try:
++        with mock.patch('websockets.connect', base.AsyncMock(return_value=ws)):
++            await con.open()
++        actual_responses = []
++        for i in range(3):
++            actual_responses.append(await con.rpc({'version': 1}))
++        assert actual_responses == expected_responses
++    finally:
++        await con.close()
index 0000000,0000000..cb9d773
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,47 @@@
++#
++# Test our constraints parser
++#
++
++import unittest
++
++from juju import constraints
++
++class TestConstraints(unittest.TestCase):
++
++    def test_mem_regex(self):
++        m = constraints.MEM
++        self.assertTrue(m.match("10G"))
++        self.assertTrue(m.match("1G"))
++        self.assertFalse(m.match("1Gb"))
++        self.assertFalse(m.match("a1G"))
++        self.assertFalse(m.match("1000"))
++
++    def test_normalize_key(self):
++        _ = constraints.normalize_key
++
++        self.assertEqual(_("test-key"), "test_key")
++        self.assertEqual(_("test-key  "), "test_key")
++        self.assertEqual(_("  test-key"), "test_key")
++        self.assertEqual(_("TestKey"), "test_key")
++        self.assertEqual(_("testKey"), "test_key")
++
++    def test_normalize_val(self):
++        _ = constraints.normalize_value
++
++        self.assertEqual(_("10G"), 10 * 1024)
++        self.assertEqual(_("10M"), 10)
++        self.assertEqual(_("10"), 10)
++        self.assertEqual(_("foo,bar"), ["foo", "bar"])
++
++    def test_parse_constraints(self):
++        _ = constraints.parse
++
++        self.assertEqual(
++            _("mem=10G"),
++            {"mem": 10 * 1024}
++        )
++
++        self.assertEqual(
++            _("mem=10G foo=bar,baz"),
++            {"mem": 10 * 1024, "foo": ["bar", "baz"]}
++        )
index 0000000,0000000..f12368e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,30 @@@
++import asyncio
++import unittest
++import juju.loop
++
++
++class TestLoop(unittest.TestCase):
++    def setUp(self):
++        # new event loop for each test
++        policy = asyncio.get_event_loop_policy()
++        self.loop = policy.new_event_loop()
++        policy.set_event_loop(self.loop)
++
++    def tearDown(self):
++        self.loop.close()
++
++    def test_run(self):
++        assert asyncio.get_event_loop() == self.loop
++        async def _test():
++            return 'success'
++        self.assertEqual(juju.loop.run(_test()), 'success')
++
++    def test_run_interrupt(self):
++        async def _test():
++            juju.loop.run._sigint = True
++        self.assertRaises(KeyboardInterrupt, juju.loop.run, _test())
++
++    def test_run_exception(self):
++        async def _test():
++            raise ValueError()
++        self.assertRaises(ValueError, juju.loop.run, _test())
index 0000000,0000000..222d881
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,155 @@@
++import unittest
++
++import mock
++import asynctest
++
++
++def _make_delta(entity, type_, data=None):
++    from juju.client.client import Delta
++    from juju.delta import get_entity_delta
++
++    delta = Delta([entity, type_, data])
++    return get_entity_delta(delta)
++
++
++class TestObserver(unittest.TestCase):
++    def _make_observer(self, *args):
++        from juju.model import _Observer
++        return _Observer(*args)
++
++    def test_cares_about_id(self):
++        id_ = 'foo'
++
++        o = self._make_observer(
++            None, None, None, id_, None)
++
++        delta = _make_delta(
++            'application', 'change', dict(name=id_))
++
++        self.assertTrue(o.cares_about(delta))
++
++    def test_cares_about_type(self):
++        type_ = 'application'
++
++        o = self._make_observer(
++            None, type_, None, None, None)
++
++        delta = _make_delta(
++            type_, 'change', dict(name='foo'))
++
++        self.assertTrue(o.cares_about(delta))
++
++    def test_cares_about_action(self):
++        action = 'change'
++
++        o = self._make_observer(
++            None, None, action, None, None)
++
++        delta = _make_delta(
++            'application', action, dict(name='foo'))
++
++        self.assertTrue(o.cares_about(delta))
++
++    def test_cares_about_predicate(self):
++        def predicate(delta):
++            return delta.data.get('fizz') == 'bang'
++
++        o = self._make_observer(
++            None, None, None, None, predicate)
++
++        delta = _make_delta(
++            'application', 'change', dict(fizz='bang'))
++
++        self.assertTrue(o.cares_about(delta))
++
++
++class TestModelState(unittest.TestCase):
++    def test_apply_delta(self):
++        from juju.model import Model
++        from juju.application import Application
++
++        loop = mock.MagicMock()
++        model = Model(loop=loop)
++        delta = _make_delta('application', 'add', dict(name='foo'))
++
++        # test add
++        prev, new = model.state.apply_delta(delta)
++        self.assertEqual(
++            len(model.state.state[delta.entity][delta.get_id()]), 1)
++        self.assertIsNone(prev)
++        self.assertIsInstance(new, Application)
++
++        # test remove
++        delta.type = 'remove'
++        prev, new = model.state.apply_delta(delta)
++        # length of the entity history deque is now 3:
++        # - 1 for the first delta
++        # - 1 for the second delta
++        # - 1 for the None sentinel appended after the 'remove'
++        self.assertEqual(
++            len(model.state.state[delta.entity][delta.get_id()]), 3)
++        self.assertIsInstance(new, Application)
++        # new object is falsy because its data is None
++        self.assertFalse(new)
++        self.assertIsInstance(prev, Application)
++        self.assertTrue(prev)
++
++
++def test_get_series():
++    from juju.model import Model
++    model = Model()
++    entity = {
++        'Meta': {
++            'supported-series': {
++                'SupportedSeries': [
++                    'xenial',
++                    'trusty',
++                ],
++            },
++        },
++    }
++    assert model._get_series('cs:trusty/ubuntu', entity) == 'trusty'
++    assert model._get_series('xenial/ubuntu', entity) == 'xenial'
++    assert model._get_series('~foo/xenial/ubuntu', entity) == 'xenial'
++    assert model._get_series('~foo/ubuntu', entity) == 'xenial'
++    assert model._get_series('ubuntu', entity) == 'xenial'
++    assert model._get_series('cs:ubuntu', entity) == 'xenial'
++
++
++class TestContextManager(asynctest.TestCase):
++    @asynctest.patch('juju.model.Model.disconnect')
++    @asynctest.patch('juju.model.Model.connect_current')
++    async def test_normal_use(self, mock_connect, mock_disconnect):
++        from juju.model import Model
++
++        async with Model() as model:
++            self.assertTrue(isinstance(model, Model))
++
++        self.assertTrue(mock_connect.called)
++        self.assertTrue(mock_disconnect.called)
++
++    @asynctest.patch('juju.model.Model.disconnect')
++    @asynctest.patch('juju.model.Model.connect_current')
++    async def test_exception(self, mock_connect, mock_disconnect):
++        from juju.model import Model
++
++        class SomeException(Exception):
++            pass
++
++        with self.assertRaises(SomeException):
++            async with Model():
++                raise SomeException()
++
++        self.assertTrue(mock_connect.called)
++        self.assertTrue(mock_disconnect.called)
++
++    @asynctest.patch('juju.client.connection.JujuData.current_controller')
++    async def test_no_current_connection(self, mock_current_controller):
++        from juju.model import Model
++        from juju.errors import JujuConnectionError
++
++        mock_current_controller.return_value = ""
++
++        with self.assertRaises(JujuConnectionError):
++            async with Model():
++                pass
index 0000000,0000000..6485408
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,76 @@@
++import pytest
++
++from juju.client.overrides import Number, Binary  # noqa
++
++
++# test cases ported from:
++# https://github.com/juju/version/blob/master/version_test.go
++@pytest.mark.parametrize("input,expected", (
++    (None, Number(major=0, minor=0, patch=0, tag='', build=0)),
++    (Number(major=1, minor=0, patch=0), Number(major=1, minor=0, patch=0)),
++    ({'major': 1, 'minor': 0, 'patch': 0}, Number(major=1, minor=0, patch=0)),
++    ("0.0.1", Number(major=0, minor=0, patch=1)),
++    ("0.0.2", Number(major=0, minor=0, patch=2)),
++    ("0.1.0", Number(major=0, minor=1, patch=0)),
++    ("0.2.3", Number(major=0, minor=2, patch=3)),
++    ("1.0.0", Number(major=1, minor=0, patch=0)),
++    ("10.234.3456", Number(major=10, minor=234, patch=3456)),
++    ("10.234.3456.1", Number(major=10, minor=234, patch=3456, build=1)),
++    ("10.234.3456.64", Number(major=10, minor=234, patch=3456, build=64)),
++    ("10.235.3456", Number(major=10, minor=235, patch=3456)),
++    ("1.21-alpha1", Number(major=1, minor=21, patch=1, tag="alpha")),
++    ("1.21-alpha1.1", Number(major=1, minor=21, patch=1, tag="alpha",
++                             build=1)),
++    ("1.21-alpha10", Number(major=1, minor=21, patch=10, tag="alpha")),
++    ("1.21.0", Number(major=1, minor=21)),
++    ("1234567890.2.1", TypeError),
++    ("0.2..1", TypeError),
++    ("1.21.alpha1", TypeError),
++    ("1.21-alpha", TypeError),
++    ("1.21-alpha1beta", TypeError),
++    ("1.21-alpha-dev", TypeError),
++    ("1.21-alpha_dev3", TypeError),
++    ("1.21-alpha123dev3", TypeError),
++))
++def test_number(input, expected):
++    if expected is TypeError:
++        with pytest.raises(expected):
++            Number.from_json(input)
++    else:
++        result = Number.from_json(input)
++        assert result == expected
++        if isinstance(input, str):
++            assert result.to_json() == input
++
++
++# test cases ported from:
++# https://github.com/juju/version/blob/master/version_test.go
++@pytest.mark.parametrize("input,expected", (
++    (None, Binary(Number(), None, None)),
++    (Binary(Number(1), 'trusty', 'amd64'), Binary(Number(1),
++                                                  'trusty', 'amd64')),
++    ({'number': {'major': 1},
++      'series': 'trusty',
++      'arch': 'amd64'}, Binary(Number(1), 'trusty', 'amd64')),
++    ("1.2.3-trusty-amd64", Binary(Number(1, 2, 3, "", 0),
++                                  "trusty", "amd64")),
++    ("1.2.3.4-trusty-amd64", Binary(Number(1, 2, 3, "", 4),
++                                    "trusty", "amd64")),
++    ("1.2-alpha3-trusty-amd64", Binary(Number(1, 2, 3, "alpha", 0),
++                                       "trusty", "amd64")),
++    ("1.2-alpha3.4-trusty-amd64", Binary(Number(1, 2, 3, "alpha", 4),
++                                         "trusty", "amd64")),
++    ("1.2.3", TypeError),
++    ("1.2-beta1", TypeError),
++    ("1.2.3--amd64", TypeError),
++    ("1.2.3-trusty-", TypeError),
++))
++def test_binary(input, expected):
++    if expected is TypeError:
++        with pytest.raises(expected):
++            Binary.from_json(input)
++    else:
++        result = Binary.from_json(input)
++        assert result == expected
++        if isinstance(input, str):
++            assert result.to_json() == input
index 0000000,0000000..a78a28d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++#
++# Test our placement helper
++#
++
++import unittest
++
++from juju import placement
++from juju.client import client
++
++class TestPlacement(unittest.TestCase):
++
++    def test_parse_both_specified(self):
++        res = placement.parse("foo:bar")
++        self.assertEqual(res[0].scope, "foo")
++        self.assertEqual(res[0].directive, "bar")
++
++    def test_parse_machine(self):
++        res = placement.parse("22")
++        self.assertEqual(res[0].scope, "#")
++        self.assertEqual(res[0].directive, "22")
index 0000000,0000000..789bbeb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++# Tox (http://tox.testrun.org/) is a tool for running tests
++# in multiple virtualenvs. This configuration file will run the
++# test suite on all supported python versions. To use it, "pip install tox"
++# and then run "tox" from this directory.
++
++[tox]
++envlist = py35
++skipsdist=True
++
++[testenv]
++usedevelop=True
++passenv =
++    HOME
++deps =
++    pytest
++    pytest-asyncio
++    pytest-xdist
++    mock
++    asynctest
++    ipdb
++
++[testenv:py35]
++# default tox env excludes integration tests
++commands = py.test -ra -v -s -x -n auto -k 'not integration' {posargs}
++
++[testenv:integration]
++basepython=python3
++commands = py.test -ra -v -s -x -n auto {posargs}